【问题标题】:Get documents only if all elements inside an array match the condition in MongoDb仅当数组中的所有元素都符合 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_ 是的,也试过了,但没有结果。让我更新我尝试过的查询。

标签: mongodb mongodb-query


【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 1970-01-01
      • 2019-03-14
      • 2023-03-11
      • 2018-03-05
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      相关资源
      最近更新 更多