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

Mongodb 查询以查找数组中有额外元素的文档,mongodb,Mongodb,我有以下文件: db.article.insert({attributes: [{value: 'a'}]}) db.article.insert({attributes: [{value: 'a'}, {value: 'c'}]}) 我需要一个查询(不是聚合,因为它将在updateMany中使用),该查询返回的文档比数组具有额外的attributes.value元素 db.article.find({"attributes.value": <extra elements than>

我有以下文件:

db.article.insert({attributes: [{value: 'a'}]})
db.article.insert({attributes: [{value: 'a'}, {value: 'c'}]})
我需要一个查询(不是聚合,因为它将在updateMany中使用),该查询返回的文档比数组具有额外的attributes.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'}]}
不返回任何内容(所有文档的“a”都有值)

请尝试以下操作:

db.article.find({attributes: { $elemMatch: { value: {$ne: 'a'}}}})
试试这个:

db.article.find({attributes: { $elemMatch: { value: {$ne: 'a'}}}})

您可以使用
$nin
筛选出包含预定义元素以外的其他元素的数组:

db.article.find({"attributes.value": {$nin: ["a"] }})

您可以使用
$nin
筛选出包含预定义元素以外的其他元素的数组:

db.article.find({"attributes.value": {$nin: ["a"] }})

你可以试试下面的查询

第一个是查询,第二个是投影

db.collection.find({
  "attributes": { "$elemMatch": { "value": { "$ne": "a" } } }
}, {
  "attributes": { "$elemMatch": { "value": { "$ne": "a" } } }
})

你可以试试下面的查询

第一个是查询,第二个是投影

db.collection.find({
  "attributes": { "$elemMatch": { "value": { "$ne": "a" } } }
}, {
  "attributes": { "$elemMatch": { "value": { "$ne": "a" } } }
})

您需要结合使用多个条件来检查阵列的
$大小

db.article.find({$or: [
  {"attributes.value": "a", "attributes": {$not: {$size: 1}}},
  {"attributes.value": {$nin: ["a"]}, "attributes": {$not: {$size: 0}}},
]})
第一个匹配具有
属性
且具有
{value:“}
元素+至少1个以上的文档

第二个条件匹配具有非空
属性且没有
{value:“}
元素的文档

它将把文档与数组中的任何额外元素进行匹配,即使它没有
值,例如

db.article.insert({attributes: [{notvalue: 'a'}]})
仍然是一场比赛

如果您需要匹配
属性
中至少有一个额外元素的非空
,则除了使用聚合表达式之外,没有其他选项:

db.article.find({ $expr: { $gt: [ 
    { $size: { $filter: { 
        input: "$attributes", 
        as: "attribute", 
        cond: { $ne: [ { $ifNull: [ "$$attribute.value", "a" ] }, "a" ]  } 
    } } },
    0
] } })    

您需要结合使用多个条件来检查阵列的
$大小

db.article.find({$or: [
  {"attributes.value": "a", "attributes": {$not: {$size: 1}}},
  {"attributes.value": {$nin: ["a"]}, "attributes": {$not: {$size: 0}}},
]})
第一个匹配具有
属性
且具有
{value:“}
元素+至少1个以上的文档

第二个条件匹配具有非空
属性且没有
{value:“}
元素的文档

它将把文档与数组中的任何额外元素进行匹配,即使它没有
值,例如

db.article.insert({attributes: [{notvalue: 'a'}]})
仍然是一场比赛

如果您需要匹配
属性
中至少有一个额外元素的非空
,则除了使用聚合表达式之外,没有其他选项:

db.article.find({ $expr: { $gt: [ 
    { $size: { $filter: { 
        input: "$attributes", 
        as: "attribute", 
        cond: { $ne: [ { $ifNull: [ "$$attribute.value", "a" ] }, "a" ]  } 
    } } },
    0
] } })    

不清楚您在问什么或者为什么不想使用聚合。我更新了OP。不使用聚合,因为它需要在更新中使用(但$expr是可以的)。您的示例显示的数组带有额外的元素,而不是额外的字段。@MạnhQuyế特恩盖伊ễn是的,我更正了操作。不清楚您在问什么或者为什么不想使用聚合。我更新了操作。没有聚合,因为它需要在更新中使用(但$expr是可以的)。您的示例显示了带有额外元素的数组,而不是额外字段。@MạnhQuyế特恩盖伊ễn对,我更正了OPit没有给我额外的元素行为:/it没有给我额外的元素行为:/