Recherche…


Remarques

Il est souvent nécessaire d'exécuter des scripts de maintenance sur votre base de données. Les champs sont renommés; les structures de données sont modifiées; les fonctionnalités que vous avez utilisées pour prendre en charge sont supprimées; les services sont migrés. La liste des raisons pour lesquelles vous pourriez vouloir changer votre schéma est sans limites. Donc, le «pourquoi» est assez explicite.

Le «comment» est un peu moins familier. Pour les personnes habituées aux fonctions SQL, les scripts de base de données ci-dessus seront étranges. Mais remarquez comment ils sont tous en JavaScript, et comment ils utilisent la même API que nous utilisons dans Meteor, à la fois sur le serveur et sur le client. Nous avons une API cohérente via notre base de données, notre serveur et notre client.

Exécutez les commandes de migration du schéma à partir du shell mongo meteor:

# run meteor
meteor

# access the database shell in a second terminal window
meteor mongo

Ajouter un champ de version à tous les enregistrements d'une collection

db.posts.find().forEach(function(doc){
    db.posts.update({_id: doc._id}, {$set:{'version':'v1.0'}}, false, true);
});

Supprimer un tableau de tous les enregistrements d'une collection

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

Renommer la collection

db.originalName.renameCollection("newName" );

Rechercher un champ contenant une chaîne spécifique

Avec le pouvoir des regex, il y a une grande responsabilité ....

db.posts.find({'text': /.*foo.*|.*bar.*/i})

Créer un nouveau champ à partir de l'ancien

db.posts.find().forEach(function(doc){
    if(doc.oldField){
        db.posts.update({_id: doc._id}, {$set:{'newField':doc.oldField}}, false, true);
    }
});

Sortez les objets d'un tableau et placez-les dans un nouveau champ

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 Record d'une collection à une autre collection (par exemple, supprimer Join & Flatten)

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

Assurez-vous que le champ existe

db.posts.find().forEach(function(doc){
    if(!doc.foo){
        db.posts.update({_id: doc._id}, {$set:{'foo':''}}, false, true);
    }
});

Assurez-vous que le champ a une valeur spécifique

db.posts.find().forEach(function(doc){
    if(!doc.foo){
        db.posts.update({_id: doc._id}, {$set:{'foo':'bar'}}, false, true);
    }
});

Supprimer un enregistrement si un champ spécifique est une valeur spécifique

db.posts.find().forEach(function(doc){
    if(doc.foo === 'bar'){
        db.posts.remove({_id: doc._id});
    }
});

Changer la valeur spécifique du champ en nouvelle valeur

db.posts.find().forEach(function(doc){
    if(doc.foo === 'bar'){
        db.posts.update({_id: doc._id}, {$set:{'foo':'squee'}}, false, true);
    }
});

Champ spécifique non défini sur Null

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

Convertir ObjectId en chaîne

db.posts.find().forEach(function(doc){
     db.accounts.update({_id: doc._id}, {$set: {'_id': doc._id.str }}, false, true);
});

Convertir les valeurs de champ des nombres en chaînes

var newvalue = "";
db.posts.find().forEach(function(doc){
     if(doc.foo){
         newvalue = '"' + doc.foo + '"';
         db.accounts.update({_id: doc._id}, {$set: {'doc.foo': newvalue}});
     }
});

Convertir les valeurs de champs de chaînes en nombres

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

Créer un horodatage à partir d'un ObjectID dans le champ _id

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

Créer un ObjectID à partir d'un objet de date

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

Rechercher tous les enregistrements contenant des éléments dans un tableau

Ce que nous faisons ici fait référence à l'index du tableau en utilisant la notation par points

db.posts.find({"tags.0": {$exists: true }})


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow