更新/插入子文档mongodb

时间:2013-07-22 22:09:38

标签: mongodb pymongo documents findandmodify

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

        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}})

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

提前致谢,

Codehai

1 个答案:

答案 0 :(得分:1)

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

query = aCollection.find_one({stuffToFind})

你应该:

query = {stuffToFind}

更新不会引发错误的原因是find_one的结果是字典。还要注意,有时上面甚至会工作,因为在更新中你实际上要求MongoDB匹配与初始对应的整个文档 查询。在这种情况下,当然后续使用查询将不会带来预期的结果,因为文档将从更新中更改。

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