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

时间:2015-04-19 07:52:55

标签: python mongodb collections documents

我在一个集合中有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':{}})方法,但我不知道如何使用它来更新每个文档的不同值。有谁知道一些快速的方法来做到这一点?

4 个答案:

答案 0 :(得分:0)

假设您在数据库中拥有此数据结构:

{

"_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"}})

我希望这会对你有所帮助。让我知道。

答案 1 :(得分:0)

我不知道它是否足够快但您可以编写一个脚本来执行此操作并使用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++ })")

答案 2 :(得分:0)

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

提到的集合中没有订购文档

答案 3 :(得分:0)

假设你在mongodb shell上运行

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