我可以使用$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,但那不(轻易)允许访问对象数组中的字段。
答案 0 :(得分:1)
您可以使用$arrayElemAt
代替.dot
表示法
db.collection.find({
"$expr": {
"$eq": [
{ "$arrayElemAt": ["$arr", 0] },
{ "$arrayElemAt": ["$arr", 1] }
]
}
})
答案 1 :(得分:0)
我发现使用$arrayElemAt的解决方法很差,但是我不明白为什么"$arr.0"
语法不起作用。
db.collection.find({
$expr: {
$eq: [
{ $arrayElemAt: ["$arr", 0] },
{ $arrayElemAt: ["$arr", 1] },
]
}
})
解决方法很糟糕,因为它不适用于对象数组:如何从索引foo
的数组arr
中仅获取字段i
?数组语法$arr.i.foo
使它变得尽可能简单。