如何使用相同的键但不同的值更新集合中的所有文档?

How to update all documents in a collection with same key but different values?

我在一个集合中有 10 个文档:

>> {'_id':0, 'self':{....}} {'_id':1,'self':{....}} ........ {'_id':9,'self':{....}}

现在我想用计数更新所有文档,这意味着更新后,文档将如下所示:

>> {'_id':0, 'count':0, 'self':{....}} {'_id':1,'count':1, 'self':{....}} ........ {'_id':9,'count':9,'self':{....}}

我知道有一个 update({},{'$set':{}}) 方法,但我不知道如何使用它来更新每个文档的不同值。有谁知道一些快速的方法来做到这一点?

假设你在数据库中有这样的数据结构:

{

"_id" : ObjectId("4f9808648859c65d"),

"array" : [

{"text" : "foo", "value" : 11},

{"text" : "foo", "value" : 22},

{"text" : "foobar", "value" : 33}

]

}

您可以使用以下查询更新特定值:

db.foo.update({"array._id" : 1}, {"$set" : {"array.$.text" : "blah"}})

希望对您有所帮助。让我知道。

我不知道它是否足够快,但你可以编写一个脚本来做到这一点并使用 eval 执行。

示例:

import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.test_database
db.eval("var count = 0; db.collection_name.find().forEach(function(obj) { obj.count = count; db.collection_name.save(obj); count++ })")
for index,each in enumerate(myCollection.find({})):
    each["count"] = index
    id = each["_id"]
    each.pop("_id", None)
    collection.update({"_id":id},{"$set":each},upsert=True)

注意:如@Michael

所述,文档在集合中未排序

假设您 运行 mongodb shell

> db.docs.find().forEach(
    function (elem) {
        db.docs.update(
            {
                _id: elem._id
            },
            {
                $set: {
                    count: elem._id
                }
            }
        );
    }
);