Mongoose, фильтровать массив вложенных документов по дате

#mongodb #mongoose

#mongodb #mongoose

Вопрос:

 [{
    "_id" : ObjectId("5f3d0f13fd6fd6667f8f56d6"),
    "name" : "A",
    "prices" : [ 
        {
            "_id" : ObjectId("5f3d0f16fd6fd6667f8f57fb"),
            "d" : ISODate("2019-08-19T00:00:00.000Z"),
            "h" : 182.1,
        }, 
        {
            "_id" : ObjectId("5f3d0f16fd6fd6667f8f57fc"),
            "d" : ISODate("2019-08-20T00:00:00.000Z"),
            "h" : 182.1,
        },
        {
            "_id" : ObjectId("5f3d0f16fd6fd6667f81f57fc"),
            "d" : ISODate("2019-08-21T00:00:00.000Z"),
            "h" : 182.1,
        }
   ]
}]
  

Ввод:

 from: '2019-08-20'
to: '2019-08-21'
  

Ожидаемый результат

 [{
        "_id" : ObjectId("5f3d0f13fd6fd6667f8f56d6"),
        "name" : "A",
        "prices" : [ 
            {
                "_id" : ObjectId("5f3d0f16fd6fd6667f8f57fc"),
                "d" : ISODate("2019-08-20T00:00:00.000Z"),
                "h" : 182.1,
            },
            {
                "_id" : ObjectId("5f3d0f16fd6fd6667f81f57fc"),
                "d" : ISODate("2019-08-21T00:00:00.000Z"),
                "h" : 182.1,
            }
       ]
    }]
  

Итак, я хочу отфильтровать prices array , чтобы он возвращал только элементы в пределах заданного диапазона дат на основе переменной d

Итак, какая-то форма агрегирования.

 mongoose.model("stock").aggregate(...)
  

Некоторая комбинация $unwind $filter , $gte , $gle

Ответ №1:

Вы можете сделать, как показано ниже

 db.collection.aggregate([
  {
    $project: {
      items: {
        $filter: {
          input: "$prices",
          as: "price",
          cond: {
            "$and": [//only date conditions
              {
                $gte: [
                  "$$price.d",
                  new Date("2019-08-20")
                ]
              },
              {
                $lte: [
                  "$$price.d",
                  new Date("2019-08-21")
                ]
              }
            ]
          }
        }
      }
    }
  }
])
  

воспроизвести

Комментарии:

1. Спасибо! Агрегирование MongoDB похоже на регулярное выражение. Невозможно изучить..