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没有给我额外的元素行为:/