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 }})


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow