0

我正在使用 pymongo 作为参考。

因此,如果我有这样的文件:

{
    'name': 'bill',
    'color': 'blue',
    'subdocument': {
        'title': 'Untitled',
        'content': 'Hello World',
    }
}

如果我发现此文档在执行 db.users.find()[0] 并将其作为参数传递给更新,除非我删除子文档,否则 Mongo 将找不到要更新的文档。除非删除子文档,否则将找到的文档传递给 find_one 也会失败。

为了优化锁定,我需要指定所有字段。如何轻松检索文档、更新文档并将原始字段作为未更改的要求传递?

4

3 回答 3

1

由于我主要出于乐观锁定的目的对此感兴趣,因此我找到了比我最初尝试更好的解决方案,这要感谢MongoDB 用户组的 Scott

解决方案是使用“版本”计数器字段,并且仅在该字段未更改时才更新。在每次更新文档时,执行更新的查询应该增加计数器。 这更快,因为不必扫描和比较所有字段即可进行更改。

于 2012-04-18T15:13:33.240 回答
0

我相信您在 MongoDB 中遇到了一个很深的错误您可以在此错误中看到类似的问题。

嵌入式文档作为二进制而不是作为文档进行比较。所以subdocument: {a:1,b:2}是不同的,subdocument:{b:2,a:1}即使他们不应该是。

请参阅此评论以了解为什么这可能是一个问题。

当然,第一个错误既严重又一年多,所以这个问题是否会很快得到修复是值得怀疑的。事实上,它目前是计划外的。

于 2012-04-17T19:11:41.907 回答
0

您是否输入了“$set”术语?

这是我所做的:

d = {
    '名称':'账单',
    “颜色”:“蓝色”,
    “子文档”:{
        '标题':'无标题',
        '内容':'你好世界',
    }
}

db.name.insert(d)
f = db.name.find_one({'name':'bill'})
打印 f
{u'color': u'blue', u'_id': ObjectId('4f8dbc834647df1428000002'), u'name': u'bill', u'subdocument': {u'content': u'Hello World', u'title': u'无标题'}}

db.name.update(f, {'$set':{'name':'fred'}})

f = db.name.find_one({'name':'fred'})
打印 f
{u'color': u'blue', u'_id': ObjectId('4f8dbc834647df1428000002'), u'name': u'fred', u'subdocument': {u'content': u'Hello World', u'title': u'无标题'}}
于 2012-04-17T19:16:16.037 回答