【问题标题】:Find query for MongoDb schema design查找 MongoDb 模式设计的查询
【发布时间】:2017-08-04 07:18:02
【问题描述】:

我有厨房架构,其结构如下,我想对该架构进行查找查询,以从包数组中获取具有特定 ID 和日期的包。

{
"_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 服务器版本是多少?
  • @chridam 版本 - 3.4.1

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

在 MongoDB 中:

您必须使用循环才能看到一个日期。对于所有日期,包括与包裹 ID 匹配的日期,您可以这样做:

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

在猫鼬中,我假设您已经导入了 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
   }
});

【讨论】:

  • 你指定 packages.package':1 而我猜 OP 要求查找数组索引
  • 使用 mongoose 更容易,然后循环遍历结果...直接使用 mongodb,会很困难且容易出错
【解决方案2】:

您可以运行聚合操作,使用 $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);
})

【讨论】:

    【解决方案3】:

    您可以在循环中比较值:

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

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2012-02-28
      相关资源
      最近更新 更多