Как найти документы и использовать агрегат для поиска недвижимости в mongodb? - PullRequest
1 голос
/ 10 июля 2020

У меня тысячи документов в коллекции. Ниже приведен образец документа

{
  _id: 12345,
  createdDate: "2020-07-10",
  cars: [
    {
      type: "Sedan",
      engine: [
        {
          type: "Petrol",
          power: 150,
          brake: {
            type: "Disc",
            hasABS: false
          }
        },
        {
          type: "Petrol",
          power: 190,
          brake: {
            type: "Drum",
            hasABS: false
          }
        },
        {
          type: "Diesel",
          power: 160,
          brake: {
            type: "Disc",
            hasABS: true
          }
        }
      ]
    },
    {
      type: "SUV",
      engine: [
        {
          type: "Petrol",
          power: 150,
          brake: {
            type: "Disc",
            hasABS: false
          }
        },
        {
          type: "Petrol",
          power: 190,
          brake: {
            type: "Drum",
            hasABS: false
          }
        },
        {
          type: "Diesel",
          power: 160,
          brake: {
            type: "Disc",
            hasABS: true
          }
        }
      ]
    }
  ]
}

Теперь я хочу найти автомобили, созданные в июле месяце, и объединить их, чтобы найти автомобиль с тормозами с абс.

Ниже был мой запрос:

db.getCollection('collection')
    .find({
        $and: [
            {"createdDate": {"$gte": new Date("2020-07-01"), "$lt": new Date("2020-07-10")}},
            aggregate(
                {"$unwind": "$cars"},
                {"$unwind": "$cars.engine"},
                {"$match": {"cars.engine.brake.hasABS": true}},
                {"$project": {"cars": 1}},
                {"$group": {"_id": "$cars"}}
            )
        ]
    })
    .pretty()

Когда я пытаюсь выполнить вышеуказанный запрос, я получаю сообщение об ошибке. Это как это должно быть сделано или есть лучший способ?

1 Ответ

1 голос
/ 10 июля 2020

Вы не можете использовать .find() и .aggreate() одновременно. В этом случае вы можете использовать тот же фильтр в пределах $ match стадии агрегирования:

db.collection.aggregate([
    { $match: { createdDate: { $gte: "2020-07-01", $lt: "2020-07-10" } } }, // or { "$gte" : new Date("2020-07-01"), "$lte" : new Date("2020-07-10") }
    { "$unwind": "$cars" },
    { "$unwind": "$cars.engine"},
    { "$match": {"cars.engine.brake.hasABS" : true}}
])

Пн go Площадка

...