我有此文件:
db.article.insert({attributes: [{value: 'a'}]})
db.article.insert({attributes: [{value: 'a'}, {value: 'c'}]})
我需要一个查询(不是一个汇总,因为它将在updateMany中使用),该查询返回的文档具有比数组更多的attribute.value元素。
db.article.find({"attributes.value": <extra elements than>: ["a"] })
// should return the document that has at least one other value than "a"
{attributes: [{value: 'a'}, {value: 'c'}]}
到目前为止,我已经尝试过:
db.article.find({'attributes.value': { $nin: ['a'] }})
不返回任何值(所有文档的“ a”都有值)
答案 0 :(得分:3)
尝试一下:
db.article.find({attributes: { $elemMatch: { value: {$ne: 'a'}}}})
答案 1 :(得分:2)
您需要结合使用多个条件和$or
检查数组的$size
:
db.article.find({$or: [
{"attributes.value": "a", "attributes": {$not: {$size: 1}}},
{"attributes.value": {$nin: ["a"]}, "attributes": {$not: {$size: 0}}},
]})
第一个与attributes
的文档匹配,该文档的元素为{value: "a"}
+至少还有一个。
第二个条件匹配具有非attributes
元素的非空{value: "a"}
的文档。
它将匹配文档中数组中包含 any 个额外元素的文档,即使它没有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
] } })
答案 2 :(得分:1)
您可以在下面的查询中尝试
第一个是$elemMatch
查询,第二个是$elemMatch
投影
db.collection.find({
"attributes": { "$elemMatch": { "value": { "$ne": "a" } } }
}, {
"attributes": { "$elemMatch": { "value": { "$ne": "a" } } }
})
答案 3 :(得分:0)
您可以使用$nin
筛选出包含除预定义元素以外的其他元素的数组:
db.article.find({"attributes.value": {$nin: ["a"] }})