【问题标题】:Mongodb find query based on an array field基于数组字段的MongoDB查找查询
【发布时间】:2020-09-14 15:14:54
【问题描述】:

收藏:

{
         "_id" : ObjectId("57506d74c469888f0d631be6"),
         "name" : "mycollection",
         "details" : [ 
             {
                 "date" : "25/03/2020",
                 "number" : "A",
                 "active" : false
              }
        },
{
        "_id" : ObjectId("57506d74c469888f0d631usi"),
        "name" : "newcollection",
        "details" : [ 

            {
                "date" : "30/03/2020",
                "number" : "C",
                "active" : false
            } 
        },
{
        "_id" : ObjectId("57506d74c4633388f0d631usi"),
        "name" : "mycollection",
        "details" : [ 

            {
                "date" : "31/03/2020",
                "number" : "C",
                "active" : false
            }
        },
    }

根据详细信息字段中的活动状态获取值的查找查询。

我试过了:

db.collection.find(
    {"name": "mycollection", "details": {"active": False}})

预期结果: 我需要在每个集合的详细信息字段下活动为 false 的集合。此处应显示记录 ID ObjectId("57506d74c469888f0d631be6") 和 ObjectId("57506d74c4633388f0d631usi")。

【问题讨论】:

  • 上面的查询对我来说似乎不错,或者你可以试试这个 db.collection.find( {"name": "mycollection", "details.active": false}}) // 布尔值区分大小写价值
  • 没用@harshitkohli
  • 嘿分享预期结果以及@Navi
  • 如果 details 数组还包含一些具有活动 true 的对象和一些具有 false 的对象,您仍然需要该文档怎么办?@Navi

标签: python mongodb mongodb-query aggregation-framework pymongo


【解决方案1】:

文档在此处包含有关此类查询的部分:https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

您的查询不起作用,因为该语法要求数组包含确切的对象,但数组中的文档包含额外的字段,因此没有匹配项。

此案例的查询是db.collection.find({"name": "mycollection", "details.active": False})

注意:这将返回数组包含 active==false 对象的所有文档,但不会过滤实际数组以删除任何 active=true 元素。

【讨论】:

  • 仍然没有线索@Joseph
【解决方案2】:

对 mongodb 或 robomongo 的查询与您的情况相同, find() 可能会起作用,但我选择了可​​以过滤值的聚合。

查询示例:

db.getCollection('collection').aggregate([{$match: {'details.active': {$ne: true},"name":"mycollection"}}]) 

简单。但请验证并还原。

【讨论】:

    【解决方案3】:

    如果 details 数组中可能有一些 active = true 的对象,而一些 objects = false,你只需要获取 active = false 的对象,那么我们可以在聚合管道中使用$filter 来过滤 details 数组

    您的查询可能是这样的

    db.collection.aggregate([
      {
        $match: {
          name: "mycollection",
          "details.active": false
        }
      },
      {
        $project: {
          name: 1,
          details: {
            $filter: {
              input: "$details",
              as: "elem",
              cond: {
                $eq: ["$$elem.active", false]
              }
            }
          }
        }
      }
    ])
    

    你可以test it here

    希望对你有帮助

    【讨论】:

    猜你喜欢
    • 2021-06-27
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2021-01-09
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多