Объединить массив после получения последнего элемента запроса - PullRequest
0 голосов
/ 22 апреля 2020

Здравствуйте. Я делаю запрос о вложенной дате, и он возвращает массив, как я могу собрать последний элемент каждого массива?

db.ft.find({ "published.dateTime": {
    $gte: ISODate("2014-01-01"), $lt: ISODate("2020-02-01")}}, { drafts: 1, _id: 0 })

Это возвращает

/* 1 */
{
    "drafts" : [ 
        104493, 
        162076, 
        161034, 
        186662
    ]
}

/* 2 */
{
    "drafts" : [ 
        118987, 
        173786
    ]
}

/* 3 */
{
    "drafts" : [ 
        11993, 
        173787
    ]
}

В идеале я хочу массив с [186662, 173786, 173787]

[РЕДАКТИРОВАТЬ 1]

I пробовал с { "drafts": {$slice:-1}} работает, но я получаю весь объект

1 Ответ

1 голос
/ 22 апреля 2020

Если вы хотите, чтобы drafts элементы из всех документов были извлечены в один массив, вам нужно использовать агрегационный конвейер :

db.collection.aggregate([
  /** Your filter condition go in here */
  {
    $match: {} 
  },
  /** Re-create drafts field with last element from 'drafts' array */
  {
    $addFields: { "drafts": { $arrayElemAt: [ "$drafts", -1 ] } }
  },
  /** group on empty string '' or null to group all docs without any filter &
   * push value of 'drafts' field from all docs to new 'drafts' field */
  {
    $group: { _id: "", drafts: { $push: "$drafts" } }
  },
  /** Optional, remove `_id :''` from response */
  {
    $project: { _id: 0 }
  }
])

Тест: mongoplayground

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