Python MongoDB-在更新中使用$in和$pull只影响单个记录,而不是$in中指定的所有记录

Python MongoDB-在更新中使用$in和$pull只影响单个记录,而不是$in中指定的所有记录,python,mongodb,pymongo,Python,Mongodb,Pymongo,好吧,如果不发布相关文档规范的示例,这可能有点难以可视化,但我不确定它是否与本例相关 本质上,我在这里试图做的是从记录ID列表中拉出文档的特定部分。下面是一个示例(我们使用PyMongo与数据库交互): 我在这里试图做的是从参与上述“活动”的“海报”的提要中删除“活动”。因此,我从“活动”中获取所有“海报”的ID,然后在update语句的$in子句中使用该列表。然后我尝试$pull取出“海报”提要子文档的相关部分 这里的问题是,它只将此更改应用于列表中的第一项,或第一张“海报”。据我所知,语法是

好吧,如果不发布相关文档规范的示例,这可能有点难以可视化,但我不确定它是否与本例相关

本质上,我在这里试图做的是从记录ID列表中拉出文档的特定部分。下面是一个示例(我们使用PyMongo与数据库交互):

我在这里试图做的是从参与上述“活动”的“海报”的提要中删除“活动”。因此,我从“活动”中获取所有“海报”的ID,然后在
update
语句的
$in
子句中使用该列表。然后我尝试
$pull
取出“海报”提要子文档的相关部分

这里的问题是,它只将此更改应用于列表中的第一项,或第一张“海报”。据我所知,语法是正确的,但这可能是一个边缘情况

我可以对列表进行迭代,并将此语句分别应用于每个ID,但是如果DB支持,我宁愿将其卸载到DB中。

一如既往,非常感谢您

编辑:

将Mongod设置为最大冗余度
-vvv
,并从与PyMongo调用对应的日志中提取以下条目:

update posters query: { _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } } update: { $pull: { feed: { _id: "4020800", object: "activity" } } }
然后我登录到shell并手动执行更新:

db.posters.update({ _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } }, { $pull: { feed: { _id: "4020800", object: "activity" } } })
db.posters.update({ _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } }, { $pull: { feed: {

我检查了shell中受影响的记录,它工作得非常好。我认为这可能是PyMongo绑定中的一个边缘情况或限制。无论如何,如果有人能解释一下,我会很高兴的

在一个更新命令中更新多个文档时,必须将multiflag设置为true。如pymongo示例所示,它已经设置为true。但是你拉的日志没有显示多重标记的迹象。我相信这就是问题所在

查看以下在mongo shell中使用多线程执行的示例

> db.posters.insert({_id:1,feed:[{_id:"4020800", object: "activity"}]})
> db.posters.insert({_id:10,feed:[{_id:"4020800", object: "activity"}]})
> db.posters.insert({_id:101,feed:[{_id:"4020800", object: "activity"}]})
> db.posters.find()
{ "_id" : 1, "feed" : [ { "_id" : "4020800", "object" : "activity" } ] }
{ "_id" : 10, "feed" : [ { "_id" : "4020800", "object" : "activity" } ] }
{ "_id" : 101, "feed" : [ { "_id" : "4020800", "object" : "activity" } ] }

它很好用。所以我相信司机有问题,而不是mongo

我也不相信在你的最后一个例子中它也能很好地工作

然后我登录到shell并手动执行更新:

db.posters.update({ _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } }, { $pull: { feed: { _id: "4020800", object: "activity" } } })
db.posters.update({ _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } }, { $pull: { feed: {
_id:“4020800”,对象:“活动”})

我检查了shell中受影响的记录,它成功了 非常好

如果没有多重标记,它只更新第一个项目。低于样品

> db.posters.update({ _id: { $in: [ 1, 10]}}, { $pull: { feed: { _id: "4020800", object: "activity" } } })
> db.posters.find()
{ "_id" : 1, "feed" : [ ] }
{ "_id" : 10, "feed" : [ { "_id" : "4020800", "object" : "activity" } ] }
{ "_id" : 101, "feed" : [ { "_id" : "4020800", "object" : "activity" } ] }