Mongoose - агрегация двух запросов с условием - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть две разные коллекции, которые связаны идентификатором сада.У меня есть список садов, и у меня есть список распределений, где будут храниться дата начала и окончания распределения.Я могу проверить, распределен ли сад, проверив, находится ли сегодня между обеими датами в таблице распределения.

Сад

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

Как мне вернуть все существующие сады с дополнительным полем 'занято' с истинным или ложным в зависимости от того, существуют ли онив документе размещения между start_date и end_date?

Я хотел бы получить массив садов со следующими данными

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

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете сделать это одним из двух способов.

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}}
])
...