2016-09-16 54 views
1

文档结构如下:如何找到的MongoDB是一个数组文件匹配字段和子文档场

{ 
"_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" 

谢谢您的支持。

回答

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 } } 

]) 

我喜欢用聚合操作东西。所有你可以用它做的事情都很棒。所以,这是怎么回事:

第一部分很简单。汇总管道中的$匹配步骤说只给我文档vendor_number是“XXXX”。

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

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

希望得到这个帮助。玩弄它,看看你可以做什么与收集和聚合。让我知道你是否需要更多的澄清。如果您之前没有使用聚合,请查看aggregation docs以及可用于聚合的pipeline operators列表。非常方便的工具。

+0

谢谢海登,这对我很有帮助。 你是对的,我想与“ACTIVE”匹配的“状态”字段,就像你说的(我已经编辑了我的帖子) 而且,如果我想提取“items.sku”和“vendor_number”采用友好的格式,如CSV? – JPacheco

+0

是的,我可以想到两种主要方式。首先,你可以在你的命令行中使用mongoexport。基本示例是mongoexport -d -c --type = --fields --out 。如果你的数据库是远程的,你将不得不添加额外的用户名和密码字段。做一个谷歌搜索,你可以找到mongoexport的文档。尽管个人而言,我可能只是以编程方式进行。无论您使用哪种语言,您都可以轻松获得结果,操作它,然后将其写出来,无论您想要如何。 –

相关问题