【问题标题】:MongoDB updates entire collection with the same documentMongoDB 使用同一个文档更新整个集合
【发布时间】:2019-09-22 21:40:02
【问题描述】:

我的 MongoDB 集合中有一些文档,它们看起来像这样:

number: first
value: 1

number: two
value: 2

number: three
value: 3

我想更新集合中的所有文档,让每个文档的value字段变成一个随机数,像这样:

number: first
value: 4747

number: two
value: 1024

number: three
value: 102

我尝试了以下代码:

cursor = db.mycol.find()

for record in cursor:
    record = db.mycol.raplace_many({}, {"value": random.randrange(10000)})

问题在于,它不是用新的随机值更新每个文档,而是用相同的随机值更新所有文档,如下所示:

number: first
value: 1024

number: two
value: 1024

number: three
value: 1024

为什么会这样?我尝试了同样的事情,但使用update_many 而不是替换,但输出是相同的。非常感谢每一个建议!

另一方面,如果我尝试使用 insert_one 插入值,则输出将是预期的,因此每个字段将具有不同的随机值。

【问题讨论】:

  • 为什么会发生这种情况:因为您只在 Python 中生成一个随机值,然后将其传递给 Mongo API。如果有的话,您需要在 Mongo 中生成值。
  • 好的!但是,为什么当我使用插入而不是更新时它会起作用?
  • 如果你这样做insert_one?好吧,插入 one 文档。如果您在循环中执行此操作并且每次都生成另一个随机值,那么您会得到许多具有不同值的文档。
  • 这不是我已经在做的吗?我的意思是,对于每条记录,它应该生成一个随机数
  • x = randrange(10000) print(x) replace_many(..., {'value': x}) – 这就是你正在做的事情。只有一个x。它的值不会改变。

标签: python mongodb


【解决方案1】:

以下代码可以解决问题:

//Fetching the array of object IDs from the collection.
var objectIDs= db.collection.distinct("_id");

// Iterating over the array and updating the 'value' correspond to each object ID with a random value. Since there is a default index on object ID, the operation would be fast.
objectIDs.forEach(id=>{
    db.collection.update(
        {
            "_id":id
        },
        {
            $set:{
                "value": Math.floor(Math.random() * 10000)
            }
        }
    )   
});

更新前:

{ "_id" : ObjectId("5d8774e19f062d4c422b3ab4"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab5"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab6"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab7"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab8"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab9"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3aba"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3abb"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3abc"), "value" : 1 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3abd"), "value" : 1 }

更新后:

{ "_id" : ObjectId("5d8774e19f062d4c422b3ab4"), "value" : 3538 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab5"), "value" : 9678 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab6"), "value" : 8325 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab7"), "value" : 2986 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab8"), "value" : 6159 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3ab9"), "value" : 4564 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3aba"), "value" : 7185 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3abb"), "value" : 2585 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3abc"), "value" : 7073 }
{ "_id" : ObjectId("5d8774e19f062d4c422b3abd"), "value" : 4094 }

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2012-10-07
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多