【问题标题】:MongoDB $pull syntaxMongoDB $pull 语法
【发布时间】:2014-10-03 19:57:11
【问题描述】:

我在 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
}});

firstArray $pull 工作得很好。 但是 secondArray.firstArrayIds 和/或 secondArray.$.firstArrayIds 没有。我在这里做错了什么?

这是我的数据结构:

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

  secondArray: [
    {
      _id: '7423'.
      someField1: 'someVal1',
      firstArrayIds: [153, 154, 155, ...]
    }
    ...
  ]
}

编辑如果secondArray 中有多个嵌入对象,其中firstArrayIds 可以包含我要删除的ID,该怎么办。换句话说,当删除firstdArray 中的对象时,我想删除all secondArrayfirstArrayIds 中的引用,而不仅仅是第一个匹配项。

【问题讨论】:

  • 您需要在查询对象中标识要更新的secondArray 元素,以便$ 可以工作。另外,我假设 firstArrayIds 不包含像您显示的单个字符串?
  • 你猜对了!已编辑。

标签: mongodb mongodb-query


【解决方案1】:

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

bulk.find({ 
    "_id": new mongo.ObjectID(req.session._id), 
    "secondArray._id": "7423" 
}).update({
    "$pull": { 
        "firstArray": { "_id": "153" },
        "secondArray.$.firstArrayIds": 153
    }
});

所以实际上除了一般文档 ID 之外,您还需要在请求中传递“两个” ID 值。即使这是嵌套的,也可以,因为您仅在“外部”级别上进行匹配,并且仅在一个数组上进行匹配。如果您尝试匹配多个数组上的位置,那么使用位置运算符是不可能的。

【讨论】:

  • 我编辑了关于我知道您在回答中一直触及的主题的问题。我一直在寻找影响多个数组的方法,现在看来这是不可能的。 stackoverflow.com/questions/17765077/…或者有什么办法吗?
  • @AndersÖstman 取决于您所说的多个数组是什么意思。正如我在该链接中指出并提到的那样,您不能在多个数组或“顶级”数组以外的任何其他数组中“匹配位置”。但是你总是可以使用“相同”的匹配位置,这通常是一种作弊。如果您有特定案例,那么您可以随时发布另一个问题。可能最好的形式是寻找您想要实现的目标的解决方案。这种形式的更新有效,“多个”的一般解决方法是批量执行多个操作。但另一个问题说明了情况。
  • 一个新问题出现了:stackoverflow.com/questions/26179021/…
  • @AndersÖstman 在我在那里发表评论之前,这看起来非常像相同的问题,因此具有相同的答案。您认为上述方法行不通的原因有哪些?
  • 对不起。我不知道如何用另一种方式表达自己。当您在之前的评论中引用“上述”时。你的意思是你的答案,还是你的意思是以“取决于......”开头的评论,这可能会给我一个我不明白的答案。 =P
猜你喜欢
  • 2014-06-01
  • 2015-05-30
  • 1970-01-01
  • 2014-03-05
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多