MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb foreach pour une collection imbriquée pour mettre à jour/copier des documents vers une autre collection

Si vous allez mettre à jour toute la collection, alors la limit sur votre curseur dans votre code actuel n'est pas nécessaire. L'erreur que vous obtenez est due au fait que mappingData champ dans le products la collection n'a pas de champ de sous-document appelé array . D'après votre exemple dans la question, seul le title champ de sous-document est disponible, et c'est celui que vous voulez.

Selon la taille de la collection de produits, l'insertion des documents convertis dans une nouvelle collection peut affecter vos opérations. Vous pouvez éviter des performances d'insertion lentes en utilisant le nouveau API d'insertion en masse qui rationalise vos opérations d'insertion en les envoyant en masse, et mieux encore, il vous donne un retour réel sur ce qui a réussi et ce qui a échoué.

L'opération d'API d'insertion en bloc suivante sera insérée dans newcollection la structure de données souhaitée où les nouveaux documents sont créés dans le forEach() boucle, en utilisant la notation entre parenthèses pour créer de nouvelles propriétés. Dans l'insertion en bloc, vous enverrez les opérations au serveur par lots de 1000, ce qui vous donne de meilleures performances car vous n'envoyez pas toutes les requêtes au serveur, juste une fois sur 1000 requêtes :

var bulk = db.newcollection.initializeUnorderedBulkOp(),   
    counter = 0;

db.products.find().forEach(function(doc) { 
    var document = {};
    if (doc.mappingData.title) document["title"] = doc[doc.mappingData.title];
    document["Manufacturer"] = doc.Manufacture;
    bulk.insert(document);
    counter++;
    if (counter % 1000 == 0) {
        bulk.execute();
        bulk = db.newcollection.initializeUnorderedBulkOp();
    }
});

if (counter % 1000 != 0) { bulk.execute(); }

Avec l'exemple ci-dessus, les commentaires que vous obtenez de l'opération d'API en bloc seraient au format suivant :

BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 2,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

Interrogation de la nouvelle collection db.newcollection.find() donnera :

/* 0 */
{
    "_id" : ObjectId("56558b0427adb60c9f7e6f8d"),
    "title" : "Toshiba Satellite Pro 4600 PIII800",
    "Manufacturer" : "Toshiba"
}

/* 1 */
{
    "_id" : ObjectId("56558b0427adb60c9f7e6f8e"),
    "title" : "Apple Ihone",
    "Manufacturer" : undefined
}