在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象
Posted
技术标签:
【中文标题】在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象【英文标题】:Get ElemMatch in Mongo Aggregation to find null or non existing array objects 【发布时间】:2022-01-21 21:57:57 【问题描述】:假设我在 Mongo 4.2 中有如下数据。 请注意,每个文档都由一个 RESULT 数组组成,该数组可能包含一个或多个或 null 子对象。
"_id" : 1, "results" : [ "product" : "a", "score" : "1" ,
"product" : "b", "score" : "5" ]
"_id" : 2, "results" : [ "product" : "a", "score" : "8" ,
"product" : "b", "score" : "7" ]
"_id" : 3, "results" : [ "product" : "a", "score" : "" ,
"product" : "b", "score" : ]
"_id" : 4, "results" : [ "product" : "b", "score" : "8" ]
"_id" : 5, "results" : [ ]
我现在正在尝试使用 ElemMatch 获取聚合管道,以查找所有具有产品“A”且得分大于“”的文档。 那个有效,我现在正在使用它:
"results": $elemMatch: "product": "a", "score": $gt : ''
但是我无法设法得到它,就像所有没有产品 A 得分的文档一样。这意味着我希望从上面的示例文档中获得 Doc #3 和 #4 和 #5。
我可以用这个得到#3:
"results": $elemMatch: "product": "a", "score": ''
还有#5:
"results.score": null
但我无法获得#4。 当然,最好只用一个查询来获得 Doc #3 和 #4 和 #5。 那么有没有办法做到这一点?
感谢您的帮助。
【问题讨论】:
【参考方案1】:...最好只用一个获得 Doc #3 和 #4 和 #5 查询
您可以使用此查询过滤器:
db.collection.aggregate([
$match:
results:
$not:
$elemMatch: product: "a", score: $nin: [ null, "" ]
])
【讨论】:
以上是关于在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象的主要内容,如果未能解决你的问题,请参考以下文章
开发中使用mongoTemplate进行Aggregation聚合查询
mongodb Aggregation聚合操作之$facet
mongodb Aggregation聚合操作之$bucket