查询以查找在数组中具有额外元素的文档

时间:2018-07-13 10:13:00

标签: mongodb

我有此文件:

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”都有值)

4 个答案:

答案 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"] }})