如何更新mongoDb文档中的所有密钥

如何更新mongoDb文档中的所有密钥,mongodb,Mongodb,嗨,我有一个具有复杂结构的集合,这个结构中的文档在结构上是不同的。我想更新所有键V,使其在此集合中具有值0。 例如: { "_id" : ObjectId("5805dfa519f972b200ea2955"), "s" : { "id" : NumberLong(36435) }, "a" : [ { "XX-(random value)" : { "V" : 4

嗨,我有一个具有复杂结构的集合,这个结构中的文档在结构上是不同的。我想更新所有键
V
,使其在此集合中具有值
0
。 例如:

   {
    "_id" : ObjectId("5805dfa519f972b200ea2955"),
    "s" : {
        "id" : NumberLong(36435)
    },
    "a" : [ 
        {
            "XX-(random value)" : {
                "V" : 4
            },
            "V" : 4,
            "u" : {
                "YY-(random value)" : {
                    "V" : 4,
                    "ZZ-(random value)" : {
                        "V" : 4,
                        "WW-(random value)" : {
                            "V" : 4
                        }
                    }
                }
            }
        }
    ]
}

您可以使用一个简短的javascript来实现这一点。您需要遍历每个文档的每个属性,检查属性的名称。如果它与名称“V”匹配,则使用值0更新它。这可以使用循环递归地完成。以下javascript代码应完成所需的工作:

function checkProperties(doc) {
    for (var propertyName in doc) {
        if (typeof doc[propertyName] == "object") {
            checkProperties(doc[propertyName]);
        } else {
            if (propertyName == "V") {
                doc[propertyName] = 0;
                print(doc[propertyName]);
            }
        }
    }
}

db.<your_collection_name>.find({}).forEach(function(doc) {
    checkProperties(doc);
    db.<your_collection_name>.save(doc);
});
函数检查属性(doc){
for(文档中的var propertyName){
if(单据类型[propertyName]=“对象”){
检查属性(文档[propertyName]);
}否则{
如果(propertyName==“V”){
单据【属性名称】=0;
打印(文档[propertyName]);
}
}
}
}
db..find({}).forEach(函数(doc){
检查属性(doc);
db..保存(doc);
});
如果将此代码保存在.js文件中,则可以针对mongo数据库运行它:

> mongo --host <host> --port <port> <script_name>.js
>mongo--host--port.js

首先,我建议您更改文档结构,并将
xx-*
在子文档中归档一个键值。也就是说,要回答您的问题,唯一的方法就是用当前的结构拍摄您文档的快照;迭代光标,然后使用批量操作更新每个文档。您能给我发送代码吗