我需要更新Mongo DB中另一个文档中的数组中的文档。
{
"_id" : ObjectId("51cff693d342704b5047e6d8"),
"author" : "test",
"body" : "sdfkj dsfhk asdfjad ",
"comments" : [
{
"author" : "test",
"body" : "sdfkjdj\r\nasdjgkfdfj",
"email" : "test@tes.com"
},
{
"author" : "hola",
"body" : "sdfl\r\nhola \r\nwork here"
}
],
"date" : ISODate("2013-06-30T09:12:51.629Z"),
"permalink" : "mxwnnnqafl",
"tags" : [
"ab"
],
"title" : "cd"
}
如果我尝试通过下面的命令更新comments数组中的第一个文档,它就可以工作。
db.posts.update({'permalink':"cxzdzjkztkqraoqlgcru"},{'$inc': {"comments.0.num_likes": 1}})
但是如果我在下面的python代码中添加相同的内容,我会收到Write错误,它无法遍历该元素。我不明白缺少什么! 任何人都可以帮帮我。
post = self.posts.find_one({'permalink': permalink})
response = self.posts.update({'permalink': permalink},
{'$inc':"comments.comment_ordinal.num_likes": 1}})
WriteError: cannot use the part (comments of comments.comment_ordinal.num_likes) to traverse the element
答案 0 :(得分:1)
comment_ordinal 应该是替换,而不是索引本身。你将它视为一个可以映射到序数的整数。我的意思是你应该做的事情:
updated_field = "comments." + str(comment_ordinal) + ".num_likes"
response = self.posts.update({'permalink': permalink}, {'$inc': {updated_field: 1}})
希望这有帮助。
答案 1 :(得分:1)
您做错了,您需要动态构建查询,最好的方法是使用str.format
方法。
response = self.posts.update_one(
{'permalink': permalink},
{'$inc': {"comments.{}.num_likes".format(comment_ordinal): 1}}
)
此外,如果因为update_one
已弃用而需要更新多个文档,则应考虑使用update_many
方法进行单次更新和update
。