Получить только последний элемент массива мангуста

У меня есть массив в документе, и я пытаюсь получить последний элемент этого массива.

Мой код:

Post.find({_id:postId},{'comments':{'$slice':-1}});

это дает мне весь объект, но массив комментариев содержит только последний элемент.

с другой стороны,

Post.find({_id:postId},{'comments':1});

давай только комментарии.

Я не нахожу, как объединить две команды вместе. Как это можно сделать?

{
 "users":[],
 "comments":["string1","string2","string3"],
 "lastValue":"Wow"
 "name":"jow"
 "_id": {
    "$oid": "5747d6bdecfae9d0560077cc"
   },
}

Спасибо


person Alon    schedule 27.05.2016    source источник
comment
Не могли бы вы опубликовать образец документа из вашей коллекции?   -  person Sandesh    schedule 27.05.2016
comment
Какова ваша цель? Из какого массива вы пытаетесь получить последний элемент?   -  person Sandesh    schedule 27.05.2016
comment
комментарии:[строка1,строка2,строка3],   -  person Alon    schedule 27.05.2016


Ответы (3)


Возможно, вы захотите использовать агрегацию mongodb (версия 3.2) $slice, например что:

Post.aggregate([
  { 
    $match: { 
      '_id.$oid': postId 
    }
  },
  { 
    $project: {
      comments: {
        $slice: [ "$comments", -1 ] 
      }
    }
  }
]);

В более ранних версиях mongodb:

Post.aggregate([
  { 
    $match: { 
      '_id.$oid': postId 
    }
  },
  { 
    $unwind: "$comments"
  },
  {
    $group : {
      _id: "$_id.$oid",
      comment: { $last: "$comments" }
    }
  }
]);
person oleh.meleshko    schedule 27.05.2016
comment
Это почти работает, я использую второй, но проблема с _id, он не находит _id. если я удаляю _id:postId, я получаю последний из каждого элемента.. - person Alon; 27.05.2016
comment
@Alon В вашем примере вы ищете { _id: postId }, но в данном примере есть $oid. Все, что вам нужно, это указать действительный идентификатор коллекции в поле $group _id и $match критерии. Обновил ответ. - person oleh.meleshko; 27.05.2016
comment
Ваше исправление не работает, я обнаружил, что использование _id:mongoose.Types.ObjectId(postId) работает - person Alon; 27.05.2016
comment
@ Алон, о, я не мог знать, что у тебя есть в postId, это тоже имеет смысл. - person oleh.meleshko; 27.05.2016

Надеюсь, это поможет.

db.Post.find({_id:postId},{'comments':{'$slice':-1},_id:0,users:0,lastValue:0,name:0});
person Sandesh    schedule 27.05.2016
comment
Я надеялся, что это что-то простое, потому что, если я добавлю что-то в схему, мне придется изменить и эту строку. - person Alon; 27.05.2016

В случае Mongoose, slice тоже может работать таким образом,

model.find({ 
    // condition
})
.select('fields')
.slice('array', -1) // <------ Here
.then((data) => {
    // handle
})
.catch();

Просто написал псевдокод, может кому поможет.

person gprathour    schedule 24.04.2020