簡體   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