1

我显然不明白如何在现有文档中更新/插入子文档。我尝试了以下方法:

        query = aCollection.find_one({stuffToFind})
        aCollection.update(query,
                      {"$set": {"subDoc" : {"1" : String, "2" : datetime.datetime.now(), "3" : otherString}}})

这只能工作一次,但如果执行此代码,我想不断更改 subDoc 的数据 1,2 和 3。find_and_modify 也失败了,因为它似乎覆盖了整个文档,删除了除 id 和更新中指定的所有其他字段之外的所有其他字段。由于我对 MongoDB 很陌生,如果有人能给我一个代码示例来解决我的问题,那就太好了。

编辑:没有“$set”语句,它在第二次执行时也保持不变..

Edit2:这似乎有效,尽管我无法再直接在 MonjaDB 中编辑受影响的(JSON)文档:D

aCollection.update(query(but this time not as a variable),
                      {"$set" : {"subDoc.1" : Sting, "subDoc.2" : datetime.datetime.now(), "subDoc.3" : otherString}})

我不知道,为什么这是有效的,所以也许有人可以解释我做错了什么..

提前致谢,

码海

4

1 回答 1

1

您在第一个示例中提供更新的查询不正确,而不是:

query = aCollection.find_one({stuffToFind})

你应该有:

query = {stuffToFind}

更新没有抛出错误的原因是结果find_one是字典。另请注意,有时上述内容甚至会起作用,因为在更新中您实际上是在要求 MongoDB 匹配与初始查询相对应的整个文档。在这种情况下,查询的后续使用当然不会带来预期的结果,因为文档将从更新中更改。

$set 仅更新我们指定的键,而其他所有内容都保持不变。这意味着如果我们更新一个嵌入对象,那么整个嵌入对象将被我们在 $set 中指定的内容替换。如果我们想精确定位嵌入对象中的键,我们必须使用点符号,就像在第二个示例中所做的那样。

于 2013-07-23T00:24:24.157 回答