Как отсортировать массив вложенных документов в mongoose / mongodb?

1

пользователь (документ mongodb)

{
  "_id": "5bccfb7515bc6d0c6872ed91",
  "notification": {
    "notidata": [
      {
        "data": {
          "para": "Your Ad '1' has been successfully submitted."
        },
        "notistatus": false,
        "_id": "5be35d89113aec40c4ca7517",
        "notidate": "2018-11-07T21:47:53.803Z"
      },
      {
        "data": {
          "para": "Your Ad '2' has been successfully submitted."
        },
        "notistatus": false,
        "_id": "5be35d92113aec40c4ca7519",
        "notidate": "2018-11-07T21:48:02.729Z"
      }
    ],
    "counter": 4
  },
  "ads": [],
  "username": "mesam",
  "email": "[email protected]",
  "password": "0",
  "country": "AZE",
  "createdOn": "2018-10-21T22:19:33.377Z",
  "__v": 0
}

route.js

User.findOneAndUpdate({ _id: user._id }, { $push: { "notification.notidata": { "data.para": "Your Ad " + "'" + thisad.heading + "'" + " has been successfully submitted."} } }, { new: true }, function (err, df) { ....

Я хочу, чтобы notidata сортировался по notidate. Использование $postion: 0 не сработало. $sort: notidate: -1

* неудачная попытка $ позиции *

User.findOneAndUpdate({ _id: user._id }, { $push: { "notification.notidata": { "data.para": "Your Ad " + "'" + thisad.heading + "'" + " has been successfully submitted.", "$position": 0} } }, { new: true }, function (err, df) {....

неудачная попытка сортировки $

User.findOneAndUpdate({ _id: user._id }, { $push: { "notification.notidata": { "data.para": "Your Ad " + "'" + thisad.heading + "'" + " has been successfully submitted.", "$sort": {"notification.notidata.notidate": -1}} } }, { new: true }, function (err, df) {....
Теги:
express
mongoose

1 ответ

1
Лучший ответ

Вы должны использовать $ sort с оператором $each а затем просто указать имя вложенного поля (не весь путь, как в вашем примере), попробуйте:

User.findOneAndUpdate({ _id: user._id }, { 
    $push: {
        "notification.notidata": {
            "$each": [ { data: { para: "Your Ad " + "'" + thisad.heading + "'" + " has been successfully submitted." } } ],
            "$sort": {"notidate": -1}
        }
    }
}, {new: true})
  • 0
    Большое спасибо! Это сработало. Тем не менее, я хочу понять, так как каждый раз, когда этот User.findOneAndUpdate будет выполняться в моем приложении, он будет иметь 1 запись notidata.para для вставки. Тогда почему что-то вроде $each нужно поместить в $push ? Разве $each для вставки более чем одного данных (например, массив данных)?
  • 1
    Я знаю, что это может сбивать с толку, в документации даже упоминается, что вы должны передавать пустой массив, если хотите сортировать только элементы. Это по замыслу
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню