MongoDB$pull语法

MongoDB$pull语法,mongodb,mongodb-query,Mongodb,Mongodb Query,Mongodb中的$pull有一个(希望是)小语法问题 bulk.find({_id: new mongo.ObjectID(req.session._id)}).updateOne({$pull: { firstArray: {id: req.params.id}, 'secondArray.firstArrayIds': req.params.id 'secondArray.$.firstArrayIds': req.params.id }}); 第一个数组$pull工作正常。

Mongodb中的$pull有一个(希望是)小语法问题

bulk.find({_id: new mongo.ObjectID(req.session._id)}).updateOne({$pull: {
  firstArray: {id: req.params.id},
  'secondArray.firstArrayIds': req.params.id
  'secondArray.$.firstArrayIds': req.params.id
}});
第一个数组
$pull
工作正常。 但是secondArray.firstArrayIds和/或secondArray.$.firstArrayIds没有。我做错了什么

这是我的数据结构:

clients: {
  firstArray: [
    {
      _id: '153'.
      someField1: 'someVal1',
    }
    ...
  ]

  secondArray: [
    {
      _id: '7423'.
      someField1: 'someVal1',
      firstArrayIds: [153, 154, 155, ...]
    }
    ...
  ]
}
编辑如果
secondArray
中有多个嵌入对象,
firstArrayIds
可以包含我要删除的id,该怎么办。换句话说,在
firstdArray
中删除对象时,我想删除所有
secondArray
firstArrayIds
中的引用,而不仅仅是第一个匹配项

您的“secondArray”具有嵌套的元素结构,因此在更新中使用位置
$
运算符时,必须在查询中标识要匹配的外部元素。你基本上需要这样的东西:

bulk.find({
“_id”:新的mongo.ObjectID(请求会话_id),
“secondArray.\u id”:“7423”
}).更新({
“$pull”:{
“firstArray”:{“\u id”:“153”},
“secondArray.$.FirstArrayId”:153
}
});

因此,除了常规文档id之外,您还需要在请求中传递“两个”id值。即使这是嵌套的,也没关系,因为您只在“外部”级别上匹配,并且只在一个数组上匹配。如果您试图在多个数组上匹配位置,则无法使用位置运算符进行匹配。

您需要在查询对象中标识要更新的
secondArray
元素,以便
$
可以工作。另外,我假设
firstArrayIds
不包含您所展示的单个字符串?您假设正确!编辑。我编辑了关于我知道你在回答中提到的主题的问题。我一直在寻找影响多个阵列的方法,现在似乎不可能做到这一点。还是有办法?@AndersÖstman取决于您所说的多个数组的含义。正如我在该链接中指出的,您不能在多个数组或“顶级”数组以外的任何数组中“匹配位置”。但你总是可以使用“相同”的匹配位置,这通常是一种欺骗。如果你有一个具体的案例,那么你可以随时发布另一个问题。也许最好的形式是寻找一个解决方案来实现你的目标。这种形式的更新是有效的,“多个”的一般解决方法是批量执行多个操作。但另一个问题表明了这一点。一个新的问题出现了:@AndersÖstman在我发表评论之前,这看起来非常像同一个问题,因此有相同的答案。你是否有理由认为上述方法不起作用?对不起。我不知道如何用另一种方式表达自己。当你在之前的评论中提到“上述”时。你是指你的答案,还是指以“取决于…”开头的评论,这可能给了我一个我不明白的答案=P