我正在关注mongodb查询:
db
.getCollection("entries")
.find({
$and: [
{
"array.attribute_1": {
$exists: true,
$not: {
$size: 0
}
}
},
{
$or: [
{ "array.attribute_2": { $exists: true, $size: 0 } },
{ "array.attribute_2": { $exists: true, $eq: {} } }
]
},
]
})
我的文档示例:
{
_id: 'foo',
array: [
{attribute_1: [], attribute_2: []},
{attribute_1: ['bar'], attribute_2: []}
]
}
据我所知,我的查询应在entries
中查找所有具有至少一个元素且已存在且不为空的array
并且存在空数组的所有attribute_1
或空对象attribute_2
。但是,此查询将查找entries
中所有具有 all 个元素的所有array
,该元素存在且不为空attribute_1
且存在空数组或空对象{{1} }。因此,找不到我的attribute_2
条目。
满足我要求的正确公式应该是什么?
答案 0 :(得分:1)
$find
将找到具有匹配条件的第一个文档,并且在您的情况下,第一个文档包含所有数组。您需要将$project
与$filter
一起使用,或者将$unwind
和$match
与聚合一起使用。
类似这样的东西:
db.collection.aggregate([
{ $unwind: "$array" },
{
$match: {
$and: [
{ "array.attribute_1.0": { $exists: true }},
{
$or: [
{ "array.attribute_2.0": { $exists: false } },
{ "array.attribute_2.0": { $eq: {} } }
]
}
]
}
}
])
您可以看到它在here上运行
此外,由于您尝试使用.0
和$exists
来查找数组是否为空且是否同时存在,因此这是一种获得与两个{{ 1}}和$exists
。