如何使用相同的键但不同的值更新集合中的所有文档?
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
}
}
);
}
);
我在一个集合中有 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
}
}
);
}
);