猫鼬-带有条件的两个查询的聚合

时间:2018-09-14 15:17:39

标签: node.js mongodb mongoose aggregation-framework

我有两个不同的集合,它们通过花园的ID连接在一起。我有一个花园列表,还有一个分配列表,它将在其中存储分配的开始日期和结束日期。我可以通过验证今天是否在分配表中的两个日期之间来检查是否分配了花园。

花园

{
    "_id": "5b98df3c9275f2291c0d7dc3",
    "id": "h1",
    "size": 43
}

分配

{
    "_id": "5b9bcb8ecb9dee0015150549",
    "user": "5b9a2cd21eb58700141a3449",
    "garden": "5b98df5c9275f2291c0d7dc6",
    "start_date":"2018-09-14T00:00:00.000Z",
    "end_date": "2018-11-14T00:00:00.000Z"
}

我如何返回所有现有花园,其附加字段“被占用”为true或false,取决于它们在start_date和end_date之间的分配文档中是否存在?

我想用以下数据获取一系列的花园

{
    "_id": "5b98df3c9275f2291c0d7dc3",
    "id": "h1",
    "size": 43,
    "occupied": true
}

1 个答案:

答案 0 :(得分:1)

您可以通过以下两种方法之一来执行此操作。

var today = ISODate();

使用$ lookup

db.garden.aggregate([
{"$lookup":{
  "from":"allocation",
  "localField":"_id",
  "foreignField":"garden",
  "as":"garden"
}},
{"$unwind":"$garden"},
{"$addFields":{
  "occupied":{
    "$and":[
      {"$gte":["$garden.start_date",today]},
      {"$lt":["$garden.end_date",today]}
    ]
  }
}},
{"$project":{"garden":0}}
])

在管道中使用$ lookup

db.garden.aggregate([
  {"$lookup":{
    "from":"allocation",
    "let":{"garden_id":"$_id"},
    "pipeline":[
      {"$match":{"$expr":{"$eq":["$$garden_id","$garden"]},"start_date":{"$gte":today},"end_date":{"$lt":today}}}
    ],
    "as":"garden"
  }},
  {"$addFields":{
    "occupied":{"$gt":[{"$size":"$garden"},0]}
  }},
  {"$project":{"garden":0}}
])