繁体   English   中英

在嵌套文档上使用mongoose / mongoDB查询

[英]Querying with mongoose/mongoDB on nested document

我有如下车型

 { "_id": "54b8a71843286774060b8bed", "name": "Car1", "active": true, "model": [ { "name": "Model1", "active": true, "_id": "54b8a71843286774060b8bee", "available": [ { "Day": "Mon", "quantity": "6" }, { "Day": "Tue", "quantity": "6" }, { "Day": "Wed", "quantity": "6" }, { "Day": "Thurs", "quantity": "6" }, { "Day": "Fri", "quantity": "0" } ] }, { "name": "Model2", "active": true, "_id": "54b8a71843286774060b8bef", "available": [ { "Day": "Mon", "quantity": "6" }, { "Day": "Tue", "quantity": "6" }, { "Day": "Wed", "quantity": "6" }, { "Day": "Thurs", "quantity": "6" }, { "Day": "Fri", "quantity": "6" } ] }, { "name": "Model3", "active": true, "_id": "54b8a71843286774060b8beg", "available": [ { "Day": "Mon", "quantity": "6" }, { "Day": "Tue", "quantity": "6" }, { "Day": "Wed", "quantity": "6" }, { "Day": "Thurs", "quantity": "6" }, { "Day": "Fri", "quantity": "0" } ] } ] } 

我正在尝试搜索给定日期的汽车可用性。 就像如果我选择“星期五”,那么它应该在周五退还我数量大于0的汽车,但目前它还在退还所有数量为0的汽车。

我写了如下查询

Car.find({'active':true,'model.available':{$ elemMatch:{数量:{$ gte:1}}}})

但是它也返回数量为0的那些文件。

为此,您将需要聚合管道

以下代码段可实现此目的:

  1. 查找具有至少一个匹配模型的所有文档。
  2. 拆分文档:将其中包含3个模型的数组的文档转换为三个文档,每个文档具有一个模型:
    {name: "Car1": 1, models: [{name: "Model1"}, {name: "Model2"}, {name: "Model3"}]}
    成为:
    {name: "Car1", models: {name: "Model1"}}{name: "Car1", models: {name: "Model2"}}{name: "Car1", models: {name: "Model3"}}
  3. 再次按数量和日期过滤拆分的凭证。
  4. (可选)再次将文档粘在一起。 您的应用程序中可能不需要它。

db.cars.aggregate([
    // First, we do your query, which will return 
    // every document that has _at least one_
    // model that is available.
    {$match: {
        'active': true,
        'model.available': {$elemMatch: { 
            'quantity': {$gte: 1},
            'Day': 'Fri'
        }}
    }},
    // We split up the found documents,
    // every document will now have exactly
    // one 'model' in it.
    {$unwind: "$model"},
    // We now filter the split documents.
    {$match: {
        'model.available': {$elemMatch: { 
            'quantity': {$gte: 1},
            'Day': 'Fri'
        }}
    }},
    // If you want, you can now glue the
    // models back together again.
    {$group: {
        _id:    "$_id", // Group all documents with the same _id
        name:   {$first: "$name"},
        active: {$first: "$active"},
        model:  {$push: "$model"}  // Make an array of models
    }}
])

重要说明:为使$gte起作用,您需要将数量存储为数字而不是字符串。 由于您的示例将数字存储为字符串,因此您可能需要仔细检查数据库中的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM