查找具有两个相等元素的MongoDB数组

时间:2019-06-30 04:49:53

标签: mongodb

我可以使用$expr$eq查询运算符来查找具有两个相等字段的MongoDB文档:

db.collection.find({ $expr: { $eq: [ '$name', '$moniker' ] } })

但是当两个字段是数组元素时,这似乎不起作用:

db.collection.find({
  $expr: {
    $eq: ["$arr.0.foo", "$arr.1.foo"]
  }
})

更不用说它不适用于对象数组:

db.collection.find({
  $expr: {
    $eq: ["$arrO.0.foo", "$arrO.1.foo"]
  }
})

该查询输出两个文档(MongoPlayground)。我在做什么错了?

这是收藏集:

[
  {
    name: "doc1",
    moniker: "doc1",
    arr: [1, 2],
    arrO: [ {foo: 1}, {foo: 2} ]
  },
  {
    name: "doc2",
    arr: [3, 3],
    arrO: [ {foo: 3}, {foo: 3} ]  // this should be found
  }
]

我看过$arrayElemAt,但那不(轻易)允许访问对象数组中的字段。

2 个答案:

答案 0 :(得分:1)

您可以使用$arrayElemAt代替.dot表示法

db.collection.find({
  "$expr": {
    "$eq": [
      { "$arrayElemAt": ["$arr", 0] },
      { "$arrayElemAt": ["$arr", 1] }
    ]
  }
})

MongoPlayground

答案 1 :(得分:0)

我发现使用$arrayElemAt的解决方法很差,但是我不明白为什么"$arr.0"语法不起作用。

db.collection.find({
  $expr: {
    $eq: [
      { $arrayElemAt: ["$arr", 0] },
      { $arrayElemAt: ["$arr", 1] },

    ]
  }
})

解决方法很糟糕,因为它不适用于对象数组:如何从索引foo的数组arr中仅获取字段i?数组语法$arr.i.foo使它变得尽可能简单。