Возвращать элементы массива вложенных документов после соответствующего элемента - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть документ, который в основном выглядит так:

{
    _id: ObjectId("5b980578db509b467960ef50"),
    items: [
        {
            _id: ObjectId("5b980578db509b467960ef90"),
            date: 2010-10-10T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef91"),
            date: 2010-10-11T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef92"),
            date: 2010-10-12T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef93"),
            date: 2010-10-13T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef94"),
            date: 2010-10-14T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef95"),
            date: 2010-10-15T00:00:00.000Z
        }
     ]
}

Я пытаюсь создать запрос, в котором я могу получить все Items после ObjectId, которое у меня есть (т.е. ObjectId("5b980578db509b467960ef92")).

Результат моего запроса должен выглядеть следующим образом:

{
    _id: ObjectId("5b980578db509b467960ef50"),
    items: [
        {
            _id: ObjectId("5b980578db509b467960ef93"),
            date: 2010-10-13T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef94"),
            date: 2010-10-14T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef95"),
            date: 2010-10-15T00:00:00.000Z
        }
     ]
}

Кроме того, я хочу все Items после соответствующего date значения данного Item.

В настоящее время я использую подход с двумя запросами, где я получаю соответствующее Item на основе ObjectID, а затем использую значение date, чтобы найти все Items впоследствии.

Есть ли "лучший" способ сделать это в одном запросе?

1 Ответ

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

Вы можете использовать $indexOfArray, чтобы найти индекс для соответствующего элемента, и использовать $slice, чтобы получить все элементы от соответствующего индекса до конца массива в 3.4. По сути, получить последние элементы до соответствующего индекса.

db.colname.aggregate([
  {"$project":{
    "items":{
      "$slice":[
        "$items",{
          "$multiply":[
            {"$subtract":[
              {"$size":"$items"},
              {"$add":[{"$indexOfArray":["$items._id",ObjectId("5b980578db509b467960ef92")]},1]}
            ]},
           -1
          ]
        }
      ]
    }
  }}
])
...