MongoDB:查找没有子文档符合条件的文档
Posted
技术标签:
【中文标题】MongoDB:查找没有子文档符合条件的文档【英文标题】:MongoDB : Find document where none of the subdocument matches criteria 【发布时间】:2020-07-25 13:58:03 【问题描述】:我想找出Record A
具有"FLD1"
且"FLD1"
不等于"VAL2"
的文档,这意味着它还应该返回Record A
不存在或FLD1
存在的文档不存在除了FLD1
不等于VAL2
。
在下面的文档中,它应该返回文档1, 3
和4
1
:因为存在Record A
,所以存在FLD1但FLD1
的值不是VAL2
3
:因为Record A
不存在
4
:因为Record A
存在但FLD1
不存在
只有 2 个 Record A
存在,FLD1
存在且 FLD1
的值等于 VAL2
。
_id:NumberLong("1"),
Name:"Doc1",
Records: [
"RecordName" : "Record A",
"State" : 1,
"Properties" :
"FLD1" : "VAL1"
,
"RecordName" : "Record B",
"State" : 1,
"Properties" :
"FLD2" : "VAL3",
"FLD3" : "VAL2"
]
,
_id:NumberLong("2"),
Name:"Doc2",
Records: [
"RecordName" : "Record A",
"State" : 1,
"Properties" :
"FLD1" : "VAL2"
"FLD4" : "VAL1"
"FLD5" : "VAL6"
,
"RecordName" : "Record C",
"State" : 1,
"Properties" :
"FLD1" : "VAL1",
"FLD2" : "VAL3"
]
,
_id:NumberLong("3"),
Name:"Doc3",
Records: [
"RecordName" : "Record B",
"State" : 0,
"Properties" :
"FLD2" : "VAL2"
"FLD3" : "VAL4"
"FLD4" : "VAL5"
,
"RecordName" : "Record C",
"State" : 1,
"Properties" :
"FLD3" : "VAL2",
"FLD5" : "VAL4"
]
,
_id:NumberLong("4"),
Name:"Doc4",
Records: [
"RecordName" : "Record A",
"State" : 1,
"Properties" :
"FLD2" : "VAL2"
,
"RecordName" : "Record C",
"State" : 1,
"Properties" :
"FLD3" : "VAL3",
"FLD4" : "VAL4"
]
有人知道如何为 mongo db 编写这样的查询吗?
另外,如果我想找出所有子文档中没有记录名称为Record B
的文档,我该如何找到?
在这种情况下,查询应该返回文档 2 和 4。
【问题讨论】:
【参考方案1】:看起来您需要 $or 运算符来包含三个单独的过滤条件:
db.collection.find(
$or: [
"Records": $not : $elemMatch: "RecordName": "Record A" ,
"Records.Properties.FLD1": $exists: false ,
"Records": $not : $elemMatch: "Properties.FLD1": "VAL2"
]
)
$elemMatch 和 $not 允许您检查是否所有 Records
的 RecordName
不等于 Record A
,然后您可以使用 $exists 来检查 FLD1
和另一个 $elemMatch
和 @ 987654332@:
Mongo Playground
【讨论】:
谢谢@mickl,我不得不稍微修改一下,请参阅提供的答案【参考方案2】:谢谢@mickl
我不得不稍微修改一下答案。
$nor: [
$and: [
"Records":
$elemMatch:
"RecordName": "Record A"
,
"Records.Properties.FLD1":
$exists: true
,
"Records":
$elemMatch:
"Properties.FLD1": "VAL2"
]
]
【讨论】:
以上是关于MongoDB:查找没有子文档符合条件的文档的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mongoose 查找子文档字段部分匹配给定条件的文档
使用 Mongoose 查找子文档字段部分匹配给定条件的文档
只有在满足条件的情况下,有没有办法将子文档推送到 mongodb 数组中?