Mongodb совокупный толчок индекс - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть следующий документ:

  {
    _id: "1",
    firstName: "john",
    lastName: "Doe",
    cars: [
      {
        "_id": "2",
        "carName": "BMW",
        "carModel": "330",
        "carColor": "silver"
      },
      {
        "_id": "4",
        "carName": "BMW",
        "carModel": "330",
        "carColor": "pink"
      },
      {
        "_id": "5",
        "carName": "Lexus",
        "carModel": "IS300",
        "carColor": "white"
      },
      {
        "_id": "6",
        "carName": "LADA",
        "carModel": "2106",
        "carColor": "blue"
      }
    ]
  }

Используя совокупный запрос, я возвращаю определенные объекты из массива cars следующего документа:

db.collection.aggregate([
  {
    $match: {
      firstName: "john"
    }
  },
  {
    $unwind: "$cars"
  },
  {
    $match: {
      "cars.carName": {
        "$in": [
          "Lexus",
          "LADA"
        ]
      }
    }
  },
  {
    $group: {
      "_id": null,
      cars: {
        $push: "$cars"
      }
    }
  }
])

Этоможно также получить индекс каждого объекта, помещаемого в массив cars?

Например:

[
  {
    "_id": null,
    "cars": [
      {
        "_id": "5",
        "carColor": "white",
        "carModel": "IS300",
        "carName": "Lexus",
        "index": 2
      },
      {
        "_id": "6",
        "carColor": "blue",
        "carModel": "2106",
        "carName": "LADA",
        "index": 4
      }
    ]
  }
]

Запрос агрегации можно проверить здесь

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете попробовать ниже агрегации (includeArrayIndex)

db.collection.aggregate([
  { "$match": { "firstName": "john" }},
  { "$unwind": { "path": "$cars", "includeArrayIndex": "index", }},
  { "$match": { "cars.carName": { "$in": ["Lexus", "LADA"] }}},
  { "$addFields": { "cars.index": "$index" }},
  { "$group": {
    "_id": null,
    "cars": { "$push": "$cars" }
  }}
])

Mongoplayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...