【问题标题】:How to update all documents in a collection with same key but different values?如何使用相同的键但不同的值更新集合中的所有文档?
【发布时间】:2015-06-25 23:03:54
【问题描述】:

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

【问题讨论】:

  • 计数应该是多少?很可能您应该使用聚合管道。
  • 您应该提供有关您所要求的内容的足够详细信息。这是count 的困惑吗?和_id字段一样吗?
  • 也许,你说的是index而不是count
  • 对不起,我不清楚的问题,count不是_id,_id是一个长字符串,包含字母和数字,count只是集合中文档的编号,所以如果我有100个文档,那么从 0 数到 99
  • @Heisenberg 啊是的,我认为你是对的

标签: python mongodb collections documents


【解决方案1】:

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

【讨论】:

  • 嗨,谢谢你的回答,但我得到了错误:异常:ReferenceError: db_new is not defined near '_new.testcount.find().forEach(function(ob'
  • 我再次测试并编辑答案更完整。希望对您有所帮助。
【解决方案2】:

假设你在 mongodb shell 上运行

> db.docs.find().forEach(
    function (elem) {
        db.docs.update(
            {
                _id: elem._id
            },
            {
                $set: {
                    count: elem._id
                }
            }
        );
    }
);
【解决方案3】:

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

{

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

我希望这对您有所帮助。告诉我。

【讨论】:

  • 嗨,谢谢你的回答,所以你的意思是我需要一个 for 循环来更新我的所有文档,对吧
  • 我想知道for循环是否有效,你知道吗?
【解决方案4】:
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 提到的集合中的文档是无序的

【讨论】:

  • 啊,谢谢你的回答,所以如果索引值对每个文档都很重要(即,如果文档有序则有意义),那么我分配索引值是没有用的,对吗?
  • @gladys0313 是的
  • @Heisenberg 酷!只是想问更多:我可以使用 sort() 对我的文档进行排序,然后索引就有意义了,对吧
  • @gladys0313 你的目标是什么?
  • @gladys0313:count 在你的应用程序中有什么意义?
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 2018-11-19
  • 2017-11-27
  • 2021-08-30
  • 2018-01-09
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多