繁体   English   中英

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

[英]How to find documents in MongoDb matching a field and subdocument field that are in an array

文件结构如下:

{
"_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 =“有效” AND items.updated_time <[给定日期]

结果示例:

"sku" : "99999999-2" 

或csv:

"sku","99999999-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”的文档。

下一部分有点毛。 投影的第一步是创建一个新字段,称为“项目”,如果需要的话,我可以将其称为“结果”或“鲍勃”。 $filter指定哪些项目应进入此新字段。 新的“ items”字段将是一个数组,该数组将具有来自上一个items字段的所有结果,因此将是input: "$items" ,在这里您使用关键字“ item”表示输入到过滤。 接下来,条件说,对于每个项目,如果项目的状态为“活动”,则仅将其放入我的新"items"数组中。 如果需要,可以将其更改为["$$items.listing_status", "LIVE"] 所有这些几乎都会给您带来结果。

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

希望能有所帮助。 试一试,看看您还可以对收集和聚合执行什么操作。 让我知道是否需要进一步说明。 如果您以前从未使用过聚合,请查看聚合文档以及可用于聚合的管道运算符列表。 很方便的工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM