2017-02-20 117 views
1

我有Kitchen架構,它的結構如下,我想對這個架構做一個查詢查詢,以便從package數組中獲取具有特定ID和日期的包。查詢查詢MongoDb架構設計

{ 
"_id" : ObjectId("58aacd498caf670a837e7093"), 
"name" : "Kitchen 1", 
"packages" : [ 
    { 
     "package" : ObjectId("58aacd038caf670a837e7091"), 
     "availibility" : [ 
      { 
       "date" : ISODate("2015-03-25T00:00:00.000Z"), 
       "count" : 20 
      }, 
      { 
       "date" : ISODate("2016-03-25T00:00:00.000Z"), 
       "count" : 30 
      } 
     ] 
    }, 
    { 
     "package" : ObjectId("58aacd108caf670a837e7092"), 
     "availibility" : [ 
      { 
       "date" : ISODate("2016-03-25T00:00:00.000Z"), 
       "count" : 10 
      } 
     ] 
    } 
], 
"__v" : 0 
} 

如果我做的包ID(58aacd038caf670a837e7091)和日期(2015-03-25T00:00:00.000Z)一個查找查詢,則響應應該是這樣的: -

{ 
"package" : ObjectId("58aacd038caf670a837e7091"), 
"date" : ISODate("2015-03-25T00:00:00.000Z") 
"count" : 20 
} 
+0

能否請您補充,預期的結果。 –

+0

我已添加結果結構 –

+0

什麼是您的MongoDB服務器版本? – chridam

回答

0

在MongoDB中:

您將不得不使用循環來查看只有一個日期。所有日期,包括匹配的一個包ID,你可以這樣做:

db.collection_name.find({'packages.package':ObjectId("package_id"),'packages.availability.date': ISODate("date")},{'packages.package':1, 'packages.availability':1}).pretty() 

在貓鼬,我假設你已經導入的廚房模式

Kichen.find({'packages.package':"package_id",'packages.availability.date': "iso_date"}, function(err, package){ 
    if(err) 
     console.log("There was an error"); 
    if(package == null){ 
     console.log("no package found"); 
    } else { 
     //do whatever 
    } 
}); 
+0

你指定'packages.package':1',而我猜OP是要求找到數組索引 –

+0

它更容易使用貓鼬然後循環遍歷結果...使用直接mongodb ,會很難和容易出錯 – suku

0

可以在循環比較值:

db.so.find().forEach(function(po){ 
    po.packages.forEach(function(co){ 
    co.availibility.forEach(function(o){ 
     if(co.package=='58aacd038caf670a837e7091' 
     && 
     String(ISODate("2015-03-25T00:00:00.000Z"))==String(o.date) 
    ){ 
     o.package=co.package; 
     printjson(o); 
     } 
    }) 
    }) 
}); 
{ 
     "date" : ISODate("2015-03-25T00:00:00Z"), 
     "count" : 20, 
     "package" : ObjectId("58aacd038caf670a837e7091") 
} 
+0

哇!這是一些查詢! – suku

0

您可以運行使用$filter合計操作運營商在幾個範圍內返回所需的字段$project流水線步驟。

考慮下面的管道:

Kitchen.aggregate([ 
    { 
     "$project": { 
      "packages": { 
       "$arrayElemAt": [ 
        { 
         "$filter": { 
          "input": "$packages", 
          "as": "pkg", 
          "cond": { 
           "$eq": [ 
            "$$pkg.package", 
            mongoose.Types.ObjectId("58aacd038caf670a837e7091") 
           ] 
          } 
         } 
        }, 
        0 
       ] 
      } 
     } 
    }, 
    { 
     "$project": { 
      "package": "$packages.package", 
      "availibility": { 
       "$arrayElemAt": [ 
        { 
         "$filter": { 
          "input": "$packages.availibility", 
          "as": "el", 
          "cond": { 
           "$eq": ["$$el.date", new Date("2015-03-25")] 
          } 
         } 
        }, 
        0 
       ] 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "package": 1, 
      "date": "$availibility.date", 
      "count": "$availibility.count" 
     } 
    } 
]).exec(function(err, docs){ 
    if (err) throw err; 
    console.log(docs); 
})