仅当数组中的所有元素都符合 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 过滤掉falsenull 值。

db.projects.find(
  "user_list.deleted": 
    $nin: [
      false,
      null
    ]
  
)

MongoDB Playground

【讨论】:

以上是关于仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档

every()方法:检测数组所有元素是否都符合指定条件

从 mongodb 数组中的所有重复项中拉出一个元素

仅当输入中的所有元素都更改时,如何使 useEffect 挂钩调用提供的效果?

MongoDB:带有数组的文本索引,只有第一个词被索引

filter()方法:检查数组中符合条件的所有元素