1

假设我有一个这样的人员集合:

{
    {'_id': 1, 'name': 'Tom', 'age': 22}, 
    {'_id': 2, 'name': 'Joe', 'age': 30}
}

代码1:

p = db.people.find_one({'_id': 1})
db.people.update(p, {'$inc': {'age': 1}})

代码2:

db.people.update({'_id': 1}, {'$inc': {'age': 1}})

我发现代码 1 和代码 2 在 pymongo 中是不同的。但我不知道有什么区别。谁能告诉我?

编辑:

我知道了。

pymongo 中的 Json 文档是乱序的。因此p = db.people.find_one({'_id': 1})可能不会返回与 '_id' 字段值为 1 的文档完全相同的文档。db.people.update(p, {'$inc': {'age': 1}})可能找不到任何满足查询 p 的文档。

4

2 回答 2

1

如果省略详细信息,代码 1执行 2 次查询,而代码 1执行 1 次查询

1.   client       mongodb          2. client        mongodb

           find_one                         update
        ------------->                   ------------->
           document
        <-------------


           update
        ------------->
于 2013-03-09T12:43:42.997 回答
1

您的示例使用ofcode 1检索完整文档,然后使用完整文档(保存在变量中)作为搜索条件进行更新。这里的副作用是,如果在执行和之间存储在数据库中的文档中的任何字段发生了变化,您的更新将找不到该文档。_id1pfind_one()update()

所以这相当于做:

db.people.update({'_id': 1, 'name': 'Tom', 'age': 22}, {'$inc': {'age': 1}})

您的示例正在code 2使用搜索条件执行更新。只要文档存在,此更新将始终成功。_id1

于 2013-03-16T03:49:40.957 回答