Вам нужно использовать несколько условий в сочетании с $or
проверкой $size
массива:
db.article.find({$or: [
{"attributes.value": "a", "attributes": {$not: {$size: 1}}},
{"attributes.value": {$nin: ["a"]}, "attributes": {$not: {$size: 0}}},
]})
Первый соответствует документам с attributes
, у которого есть элемент {value: "a"}
+, по крайней мере, 1.
Второе условие соответствует документам с непустым attributes
, который не имеет элемента {value: "a"}
.
Он будет соответствовать документам с любым дополнительным элементом в массиве, даже если у него нет value
, например
db.article.insert({attributes: [{notvalue: 'a'}]})
, все равно будет соответствовать.
Если вам нужно сопоставить документы, где attributes
имеет как минимум 1 дополнительный элемент с непустым value
, другого варианта нет, но используйте $expr
с выражениями агрегации:
db.article.find({ $expr: { $gt: [
{ $size: { $filter: {
input: "$attributes",
as: "attribute",
cond: { $ne: [ { $ifNull: [ "$$attribute.value", "a" ] }, "a" ] }
} } },
0
] } })