findOne()和direct update()之后update()有什么区别?

时间:2013-03-09 12:26:51

标签: mongodb pymongo

假设我有这样的人物收藏:

{
    {'_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}})

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

编辑:

我明白了。

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

2 个答案:

答案 0 :(得分:1)

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

1.   client       mongodb          2. client        mongodb

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


           update
        ------------->

答案 1 :(得分:1)

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

所以这相当于:

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

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