2016-09-16 46 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的文檔。儘管個人而言,我可能只是以編程方式進行。無論您使用哪種語言,您都可以輕鬆獲得結果,操作它,然後將其寫出來,無論您想要如何。 –

相關問題