仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档
Posted
技术标签:
【中文标题】仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档【英文标题】:Get documents only if all elements inside an array match the condition in MongoDb 【发布时间】:2021-05-24 10:53:54 【问题描述】:我正在尝试删除所有孤立项目。在 db 中,我需要获取删除所有用户的项目。已经尝试使用以下查询,但它总是给出删除字段不存在的结果。
db.projects.find(
"user_list":
$not:
$elemMatch:
"deleted": false
,
"user_list.deleted": $exists: true
, "user_list": 1)
在编写查询以获取删除所有用户的唯一项目时需要帮助。例如,在下面的示例中,我应该只获取第二个文档。
项目列表
/* 1 */
"_id" : ObjectId("636a6aa584d5f92f14f0c548"),
"user_list" : [
"deleted" : false,
"user_id" : "602cf72a3fcad3cc605b8d59"
,
"deleted" : true,
"user_id" : "602cf72a3fcad3cc605b8d50"
]
/* 2 */
"_id" : ObjectId("602e443bacdd4184511d6e29"),
"user_list" : [
"deleted" : true,
"user_id" : "602cf72a3fcad3cc605b8d59"
,
"deleted" : true,
"user_id" : "602cf72a3fcad3cc605b8d59"
,
"deleted" : true,
"user_id" : "602cf72a3fcad3cc605b8d59"
]
/* 3 */
"_id" : ObjectId("60332242acdd4184511ed664"),
"user_list" : [
"deleted" : true,
"user_id" : "602cf72a3fcad3cc605b8d59",
,
"deleted" : true,
"user_id" : "602cf72a3fcad3cc605b8d59"
,
"user_id" : "602cf72a3fcad3cc605b8d59"
]
【问题讨论】:
您也可以检查该字段是否存在。 谢谢@prasad_ 是的,也试过了,但没有结果。让我更新我尝试过的查询。 【参考方案1】:db.projects.find(
"user_list.deleted": $ne: false
)
应该给你所有没有删除记录的项目=== false。
您也可以将$and
与$ne: null
的null 设置为deleted
一起避免它们。
更新: 来自https://docs.mongodb.com/manual/reference/operator/query/and/index.html 我可以想象以下工作,但当我在本地机器上运行它时无效。这可能是因为嵌套。
user_list.deleted: $ne: false, $exists: true
但这一个有效,
user_list.deleted: $ne: false, $ne: null
【讨论】:
感谢@Anil,但这仍然是第二和第三条记录。 不是你想要的第二个结果吗?I am trying to get the projects when all of its users are deleted
是的,我需要第二个,但您的查询也获取了第二个和第三个结果
正如我最初所说,您可以添加 $and: $ne: null
,就像我在最后展示的那样以获得您的结果。
@AnilMaharjan user_list.deleted: $ne: false, $ne: null
只会过滤掉 null
值,因为 $ne: null
会覆盖前面的查询。同 user_list.deleted: $ne: null
【参考方案2】:
db.projects.find( $and: [
"user_list" : $in : ["deleted"] ,
"user_list" : $elemMatch : "deleted" : true ,
"user_list" : $elemMatch : "deleted" :$ne:false ]);
试试这个查询。我认为它应该适用于所有提到的情况。
【讨论】:
【参考方案3】:您可以使用$nin
过滤掉false
和null
值。
db.projects.find(
"user_list.deleted":
$nin: [
false,
null
]
)
MongoDB Playground
【讨论】:
以上是关于仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档