MongoDB:在集合中的所有文档中更新嵌套数组字段

3

这是我的示例文档:

{
    "isUpdated": false,
    "isDeleted": false,
    "customer": {
        "name": "John Doe",
        "address": [{
            "houseNum": 5,
            "streetName": "Example Avenue",
            "postalCode": "90210"
        }, {
            "houseNum": 15,
            "streetName": "Second Example Avenue",
            "postalCode": "91210"
        }]
    }
}

我有几篇类似的文档。我想通过为所有customer.address添加另一个键值对来更新我的收藏中的所有文档。我无法访问地址内部的对象,该怎么做?

我想将这个键值对添加到所有address中:"country": "USA"。所以,现在示例文档将如下所示:

{
    "isUpdated": false,
    "isDeleted": false,
    "customer": {
        "name": "John Doe",
        "address": [{
            "houseNum": 5,
            "streetName": "Example Avenue",
            "postalCode": "90210",
            "country": "USA"
        }, {
            "houseNum": 15,
            "streetName": "Second Example Avenue",
            "postalCode": "91210",
            "country": "USA"
        }]
    }
}

这个有帮助吗:https://dev59.com/Hl4c5IYBdhLWcg3weqW8 - Lalit Agarwal
1个回答

6
如果我理解正确,您想更新所有文档并在customer.address的每个子文档中添加"country": "USA"。您可以使用Bulk() API来实现这一点。
var bulk = db.collection.initializeOrderedBulkOp();
var count = 0;

db.collection.find().forEach(function(doc){
    var addr = doc["customer"]["address"]; 
    for (var i = 0; i < addr.length; i++) {
        bulk.find({ 
            "_id": doc._id, 
            "customer.address": { "$elemMatch": {
                "houseNum": addr[i][ "houseNum" ], 
                "streetName": addr[i][ "streetName" ]}}
        }).update({
            "$set": { "customer.address.$.country": "USA" }
        })} 
    count++;
    if ( count % 1000 == 0 ) {
        // Execute per 1000 operations and re-init.
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }
})

// Clean up queues
if ( count % 1000 != 0 ){
    bulk.execute();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接