简体   繁体   English

查找MongoDb架构设计的查询

[英]Find query for MongoDb schema design

I have Kitchen schema which is structured as below, I want to do a find query on this schema to get a package with particular ID and Date from packages array. 我有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
}

If I do a find query with package ID(58aacd038caf670a837e7091) and date(2015-03-25T00:00:00.000Z), then response should be like :- 如果我使用包ID(58aacd038caf670a837e7091)和日期(2015-03-25T00:00:00.000Z)查找查询,则响应应如下: -

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

In mongodb: 在mongodb:

You will have to use a loop to see only a single date. 您将不得不使用循环来仅查看单个日期。 For all dates including the matching one for the package id you can do this: 对于所有日期,包括匹配的一个包ID,您可以这样做:

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

In mongoose, I am assuming you have imported the Kitchen schema 在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
   }
});

You can compare values in loop: 您可以循环比较值:

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

You can run an aggregate operation that uses the $filter and $arrayElemAt operators to return the desired fields within a couple of $project pipeline steps. 您可以运行使用$filter$arrayElemAt运算符的聚合操作,以在几个$project管道步骤中返回所需的字段。

Consider the following pipeline: 考虑以下管道:

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