【问题标题】:How to find documents in MongoDb matching a field and subdocument field that are in an array如何在 MongoDb 中查找与数组中的字段和子文档字段匹配的文档
【发布时间】:2016-09-16 18:58:23
【问题描述】:

文档结构如下:

{
"_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"),
    }
]

}

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

1) "vendor_number" = "XXX"

2) items.status = "ACTIVE" AND items.updated_time

结果示例:

"sku" : "99999999-2" 

或 csv:

"sku","99999999-2"

感谢您的支持。

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    这应该是你想要的。虽然我假设你想要"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”,如果我愿意,我可以将其称为“results”或“bob”。 $filter 指定哪些项目应该进入这个新字段。新的“items”字段将是一个数组,其中包含先前 items 字段的所有结果,因此是 input: "$items",您在其中使用关键字“item”来表示进入过滤器的每个输入项。接下来,条件是,对于每个项目,如果项目的状态为“活动”,则仅将其放入我的新"items" 数组中。如果需要,您可以将其更改为 ["$$items.listing_status", "LIVE"]。所有这一切都会给你带来结果。

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

    希望对您有所帮助。试一试,看看你还能用集合和聚合做什么。如果您需要更多说明,请告诉我。如果您以前没有使用过聚合,请查看aggregation docs 和您可以与聚合一起使用的pipeline operators 列表。非常方便的工具。

    【讨论】:

    • 谢谢海登,这对我很有帮助。你是对的,我想与“活动”匹配的“状态”字段,就像你说的(我已经编辑了我的帖子)而且,如果我只想提取“items.sku”和“vendor_number”怎么办以友好的格式,例如 CSV ?
    • 是的,我能想到的主要方法有两种。首先,您可以在命令行中使用 mongoexport。基本示例是 mongoexport -d -c --type= --fields --out 。如果您的数据库是远程的,则必须为用户名和密码添加其他字段。做一个谷歌搜索,你可以找到 mongoexport 的文档。尽管就个人而言,我可能只是以编程方式进行。无论您使用何种语言,您都可以轻松获得结果、对其进行操作,然后随心所欲地写出来。
    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2016-04-23
    • 2020-10-16
    相关资源
    最近更新 更多