Sök…
Anmärkningar
Det är ofta nödvändigt att köra underhållsskript i din databas. Fält får nytt namn; datastrukturer förändras; funktioner som du brukade stödja tas bort; tjänster migreras. Listan med skäl till varför du kanske vill ändra ditt schema är ganska obegränsad. Så "varför" är ganska självförklarande.
"Hur" är lite mer okänt. För de personer som är vana vid SQL-funktioner kommer databasskripten ovan att se konstiga ut. Men se hur de alla är i javascript och hur de använder samma API som vi använder i hela Meteor, både på servern och klienten. Vi har ett konsekvent API genom vår databas, server och klient.
Kör schema migration kommandon från meteor mongo skal:
# run meteor
meteor
# access the database shell in a second terminal window
meteor mongo
Lägg till versionfält till alla poster i en samling
db.posts.find().forEach(function(doc){
db.posts.update({_id: doc._id}, {$set:{'version':'v1.0'}}, false, true);
});
Ta bort array från alla poster i en samling
db.posts.find().forEach(function(doc){
if(doc.arrayOfObjects){
// the false, true at the end refers to $upsert, and $multi, respectively
db.accounts.update({_id: doc._id}, {$unset: {'arrayOfObjects': "" }}, false, true);
}
});
Byt namn på samling
db.originalName.renameCollection("newName" );
Hitta fält som innehåller specifik sträng
Med regex-kraften kommer stort ansvar ....
db.posts.find({'text': /.*foo.*|.*bar.*/i})
Skapa nytt fält från gammalt
db.posts.find().forEach(function(doc){
if(doc.oldField){
db.posts.update({_id: doc._id}, {$set:{'newField':doc.oldField}}, false, true);
}
});
Dra föremål ur en matris och placera i ett nytt fält
db.posts.find().forEach(function(doc){
if(doc.commenters){
var firstCommenter = db.users.findOne({'_id': doc.commenters[0]._id });
db.clients.update({_id: doc._id}, {$set:{'firstPost': firstCommenter }}, false, true);
var firstCommenter = db.users.findOne({'_id': doc.commenters[doc.commenters.length - 1]._id });
db.clients.update({_id: doc._id}, {$set:{'lastPost': object._id }}, false, true);
}
});
Blob-skiva från en samling i en annan samling (dvs Ta bort gå med & platta)
db.posts.find().forEach(function(doc){
if(doc.commentsBlobId){
var commentsBlob = db.comments.findOne({'_id': commentsBlobId });
db.posts.update({_id: doc._id}, {$set:{'comments': commentsBlob }}, false, true);
}
});
Se till att säkert fält existerar
db.posts.find().forEach(function(doc){
if(!doc.foo){
db.posts.update({_id: doc._id}, {$set:{'foo':''}}, false, true);
}
});
Se till att säkert fält har specifikt värde
db.posts.find().forEach(function(doc){
if(!doc.foo){
db.posts.update({_id: doc._id}, {$set:{'foo':'bar'}}, false, true);
}
});
Ta bort posten om det specifika fältet är specifikt värde
db.posts.find().forEach(function(doc){
if(doc.foo === 'bar'){
db.posts.remove({_id: doc._id});
}
});
Ändra specifikt värde för fältet till nytt värde
db.posts.find().forEach(function(doc){
if(doc.foo === 'bar'){
db.posts.update({_id: doc._id}, {$set:{'foo':'squee'}}, false, true);
}
});
Åtgärdar specifikt fält till noll
db.posts.find().forEach(function(doc){
if(doc.oldfield){
// the false, true at the end refers to $upsert, and $multi, respectively
db.accounts.update({_id: doc._id}, {$unset: {'oldfield': "" }}, false, true);
}
});
Konvertera ObjectId till String
db.posts.find().forEach(function(doc){
db.accounts.update({_id: doc._id}, {$set: {'_id': doc._id.str }}, false, true);
});
Konvertera fältvärden från siffror till strängar
var newvalue = "";
db.posts.find().forEach(function(doc){
if(doc.foo){
newvalue = '"' + doc.foo + '"';
db.accounts.update({_id: doc._id}, {$set: {'doc.foo': newvalue}});
}
});
Konvertera fältvärden från strängar till siffror
var newvalue = null;
db.posts.find().forEach(function(doc){
if(doc.foo){
newvalue = '"' + doc.foo + '"';
db.accounts.update({_id: doc._id}, {$set: {'doc.foo': newvalue}});
}
});
Skapa en tidsstämpel från ett ObjectID i _id-fältet
db.posts.find().forEach(function(doc){
if(doc._id){
db.posts.update({_id: doc._id}, {$set:{ timestamp: new Date(parseInt(doc._id.str.slice(0,8), 16) *1000) }}, false, true);
}
});
Skapa ett ObjectID från ett datumobjekt
var timestamp = Math.floor(new Date(1974, 6, 25).getTime() / 1000);
var hex = ('00000000' + timestamp.toString(16)).substr(-8); // zero padding
var objectId = new ObjectId(hex + new ObjectId().str.substring(8));
Hitta alla poster som har artiklar i en matris
Det vi gör här hänvisar till arrayindexet med punktnotation
db.posts.find({"tags.0": {$exists: true }})