如何在MongoDb中查找与数组中的字段和子文档字段匹配的文档

时间:2016-09-16 18:58:24

标签: arrays mongodb mongodb-query

文件结构如下:

{
"_id" : "V001-99999999",
"vendor_number" : "V001",
"created_time" : ISODate("2016-04-26T22:15:34Z"),
"updated_time" : ISODate("2016-06-07T21:45:46.413Z"),
"items" : [
    {
        "sku" : "99999999-1",
        "status" : "ACTIVE",
        "listing_status" : "LIVE",
        "inventory" : 10,
        "created_time" : ISODate("2016-05-14T22:15:34Z"),
        "updated_time" : ISODate("2016-05-14T20:42:21.753Z"),
    },
    {
        "sku" : "99999999-2",
        "status" : "INACTIVE",
        "listing_status" : "LIVE",
        "inventory" : 10,
        "created_time" : ISODate("2016-04-26T22:15:34Z"),
        "updated_time" : ISODate("2016-06-06T20:42:21.753Z"),
    }
]

}

我想从项目中获取sku,条件是:

1)“vendor_number”=“XXX”

2)items.status =“ACTIVE”AND items.updated_time< [given_date]

结果示例:

"sku" : "99999999-2" 

或csv:

"sku","99999999-2"

感谢您的支持。

1 个答案:

答案 0 :(得分:2)

这应该是你想要的。虽然我假设你想要"status": "active"

db.getCollection('collection').aggregate([

 { $match: { "vendor_number": "XXXX" } },

 { $project: {
     "items": {
         $filter: {
            input: "$items",
            as: "item",
            cond: { $eq: ["$$item.status", "ACTIVE"] } // or maybe ["$$item.listing_status", "LIVE"] ?
         }
      }
    }
  },     

 { $project: { "items.sku": true } }

])

我喜欢用聚合来操纵东西。你用它做的所有事情都很棒。所以这是正在发生的事情:

第一部分很简单。汇总管道中的$ match步骤说明只需给出vendor_number为“XXXX”的文档。

下一部分有点毛茸茸。第一个投影步骤会创建一个名为“items”的新字段,如果我愿意,我可以称之为“结果”或“bob”。 $filter指定应将哪些项目放入此新字段。新的“items”字段将是一个数组,其中包含前一个item字段的所有结果,因此input: "$items",您使用关键字“item”来表示进入过滤器的每个输入项。接下来,条件说,对于每个项目,如果项目的状态为“ACTIVE”,则仅将其放入我的新"items"数组中。如果您需要,可以将其更改为["$$items.listing_status", "LIVE"]。所有这一切都会给你带来结果。

最后一个项目除了新“items”数组中每个元素中的items.sku之外,除去所有其他字段。

希望这有帮助。玩弄它,看看你还可以用收集和聚合做些什么。如果您需要进一步澄清,请与我们联系。如果您之前未使用过聚合,请查看aggregation docs以及可用于聚合的pipeline operators列表。非常方便的工具。