Python MongoDB使用相同的文档更新整个集合

Python MongoDB使用相同的文档更新整个集合,python,mongodb,Python,Mongodb,我的MongoDB收藏中有一些文档,它们看起来像这样: number: first value: 1 number: two value: 2 number: three value: 3 number: first value: 4747 number: two value: 1024 number: three value: 102 number: first value: 1024 number: two value: 1024 number: three value: 1

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

number: first
value: 1

number: two
value: 2

number: three
value: 3
number: first
value: 4747

number: two
value: 1024

number: three
value: 102
number: first
value: 1024

number: two
value: 1024

number: three
value: 1024
我想更新集合中的所有文档,以便将每个文档的
字段更改为随机数,如下所示:

number: first
value: 1

number: two
value: 2

number: three
value: 3
number: first
value: 4747

number: two
value: 1024

number: three
value: 102
number: first
value: 1024

number: two
value: 1024

number: three
value: 1024
我尝试了以下代码:

cursor = db.mycol.find()

for record in cursor:
    record = db.mycol.raplace_many({}, {"value": random.randrange(10000)})
问题在于,它不是用新的随机值更新每个文档,而是用相同的随机值更新所有文档,如下所示:

number: first
value: 1

number: two
value: 2

number: three
value: 3
number: first
value: 4747

number: two
value: 1024

number: three
value: 102
number: first
value: 1024

number: two
value: 1024

number: three
value: 1024
为什么会这样?我尝试了同样的方法,但是使用了
update\u many
而不是replace,但是输出是相同的。感谢您的每一个建议


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

以下代码可以完成此操作:

//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 }
更新后:

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

发生这种情况的原因:因为您在Python中只生成一个随机值,并将其传递给MongoAPI。你需要在Mongo中生成值,如果有的话。好的!但是,当我使用insert而不是update时,为什么它会起作用呢?如果您使用
insert\u one
?好吧,那就插入一份文件。如果在循环中这样做,并且每次都生成另一个随机值,那么就会得到许多具有不同值的文档。这不是我已经在做的吗?我的意思是,对于每个记录,它应该生成一个随机数
x=randrange(10000)
print(x)
替换许多(…,{'value':x})
——这就是您正在做的。只有一个
x
。它的值不变。