【问题标题】:Returning a subset of array items in MongoDB在 MongoDB 中返回数组项的子集
【发布时间】:2015-09-05 16:55:37
【问题描述】:

谁能提供关于如何返回数组项子集的建议?例如,假设我有一个文档集合(类似于下面的示例),其中包含一个简单的 _id 键和一个包含对象数组的键。

我想找到所有 _id 和符合简单条件的匹配对象:

// campaigns
{
  "_id" : "Fred's C25K",
  "campaignData" : [
    {
      "date" : "2015-06-17",
      "source" : "nike"
    },
    {
      "date" : "2015-06-17",
      "source" : "reebok",
    },
    {
      "date" : "2015-06-12",
      "source" : "nike"
    },
    {
      "date" : "2015-06-14",
      "source" : "adidas"
    },
  ]
},
{
  "_id" : "Mike's Marathon",
  "campaignData" : [
    {
      "date" : "2015-06-17",
      "source" : "nike"
    }
  ]
},
{
  "_id" : "Jacob's Jamboree",
  "campaignData" : [
    {
      "date" : "2015-06-17",
      "source" : "keen"
    }
  ]
}

我希望我的结果包含 _id 和任何匹配对象,例如日期值“2015-06-17”

// GOAL => To generate a result set that looks like:
{
  "_id" : "Fred's C25K",
  "campaignData" : [
    {
      "date" : "2015-06-17",
      "source" : "nike"
    },
    {
      "date" : "2015-06-17",
      "source" : "reebok",
    }
  ]
},
{
  "_id" : "Mike's Marathon",
  "campaignData" : [
    {
      "date" : "2015-06-17",
      "source" : "nike"
    }
  ]
},
{
  "_id" : "Jacob's Jamboree",
  "campaignData" : [
    {
      "date" : "2015-06-17",
      "source" : "keen"
    }
  ]
}

【问题讨论】:

    标签: arrays node.js mongodb


    【解决方案1】:

    使用aggregation framework 来获得所需的结果。以下管道包含一个 $match 运算符阶段,作为过滤应通过管道的文档的第一步。

    下一阶段是$addFields 运算符,它允许您输出包含输入文档中所有现有字段和新添加字段的文档。

    在此步骤中,您可以使用$filter 运算符根据指定的过滤器选择要返回的数组子集:

    db.collection.aggregate([
        { "$match": {
            "campaignData.date" : "2015-06-17"
        } },
        { "$addFields": {
            "campaignData": {
                "$filter": {
                    "input": "$campaignData",
                    "cond": {
                        "$eq": ["$$this.date", "2015-06-17"]
                    }
                }
            }
        } }
    ])
    

    结果

    /* 0 */
    {
        "result" : [ 
            {
                "_id" : "Mike's Marathon",
                "campaignData" : [ 
                    {
                        "date" : "2015-06-17",
                        "source" : "nike"
                    }
                ]
            }, 
            {
                "_id" : "Jacob's Jamboree",
                "campaignData" : [ 
                    {
                        "date" : "2015-06-17",
                        "source" : "keen"
                    }
                ]
            }, 
            {
                "_id" : "Fred's C25K",
                "campaignData" : [ 
                    {
                        "date" : "2015-06-17",
                        "source" : "nike"
                    }, 
                    {
                        "date" : "2015-06-17",
                        "source" : "reebok"
                    }
                ]
            }
        ],
        "ok" : 1
    } 
    

    【讨论】:

    • 非常感谢!!!我不认为我需要在日期匹配两次,但现在这完全有道理。
    • @RBrennan 不用担心,很高兴为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多