我显然不明白如何在现有文档中更新/插入子文档。 我尝试了以下方法:
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
答案 0 :(得分:1)
您在第一个示例中提供更新的查询不正确,而不是:
query = aCollection.find_one({stuffToFind})
你应该:
query = {stuffToFind}
更新不会引发错误的原因是find_one
的结果是字典。还要注意,有时上面甚至会工作,因为在更新中你实际上要求MongoDB匹配与初始对应的整个文档
查询。在这种情况下,当然后续使用查询将不会带来预期的结果,因为文档将从更新中更改。
$ set仅更新我们指定的密钥,而其他所有密钥都保持不变。这意味着如果我们更新嵌入对象,那么整个嵌入对象将被我们在$ set中指定的内容替换。如果我们想要精确定位嵌入对象中的键 我们必须像在第二个例子中那样使用点符号。