簡體   English   中英

查找MongoDb架構設計的查詢

[英]Find query for MongoDb schema design

我有Kitchen架構,其結構如下,我想對此架構進行查找查詢以獲取具有特定ID和包來自packages數組的包。

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

在mongodb:

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

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

在mongoose中,我假設你已經導入了Kitchen模式

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

您可以循環比較值:

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

您可以運行使用$filter$arrayElemAt運算符的聚合操作,以在幾個$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);
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM