Node.js Mongo использует $position, а $push-ing не работает должным образом

У меня нет такого опыта работы с Node.js или Mongo, поэтому, пожалуйста, извините за любые ошибки, которые я могу допустить при публикации этого.

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

var MessagesSchema = new mongoose.Schema({
    title: {
        type: String,
        default: "Untitled Message Group"
    },
    members: {
        type: Array
    },
    unreadCounts: {
        type: Array
    },
    admins: {
        type: Array
    },
    messages: {
        sender: {
            type: String
        },
        content: {
            type: String
        },
        date: {
            type: Number
        }
    }
});

Новые сообщения от пользователей отправляются в раздел «сообщения», а их информация помещается в массивы «отправитель», «контент» и «дата». Я пытаюсь сделать так, чтобы за один раз загружалось только определенное количество сообщений, и вы можете нажать кнопку «Загрузить еще», чтобы загрузить больше сообщений. Это работает, однако мой массив находится в обратном порядке, и старые сообщения загружаются первыми, а самые новые загружаются последними. Итак, я пытаюсь сделать так, чтобы я переворачивал массив при вводе данных. Вот старый метод, который у меня был для $push-ing:

Messages.updateOne({
    '_id': ObjectId(data[2])
}, {
    $push: {
        messages: {
            sender: data[1],
            content: data[0],
            date: Date.now()
        }
    },
    $inc: {
        "unreadCounts.$[]": 1
    }
}, function (err, result) {
   //...
});

Вот новый способ, который я пробовал:

Messages.updateOne({
    '_id': ObjectId(data[2])
}, {
    $push: {
        messages: {
            $each: [{sender: data[1], content: data[0], date: Date.now()}],
            $position: 0
        }
    },
    $inc: {
        "unreadCounts.$[]": 1
    }
}, function (err, result) {
    //...
});

А вот пример некоторых данных, которые будут в нем:

{
    "_id": ObjectId("5ce4990a11fa8f0d6e27344a"),
    //...
    //Other stuff
    //...
    "messages": [{
        "sender": "5c4ba709701212087e4d1bc9",
        "content": "1st message sent",
        "date": 1558485260497
    }, {
        "sender": "5c4ba709701212087e4d1bc9",
        "content": "2nd message sent",
        "date": 1558485261095
    }, {
        "sender": "5c4ba709701212087e4d1bc9",
        "content": "3rd message sent",
        "date": 1558485261446
    }]
}

Третье сообщение — это последнее сообщение, которое было отправлено. Я бы хотел, чтобы порядок был обратным: 3-е сообщение было бы вверху, затем 2-е сообщение, затем 1-е.

Однако по какой-то причине использование $position не работает. Элементы помещаются в конец массива, а не в начало, как ожидалось.

Кто-нибудь знает, могут ли они помочь мне понять, почему? Может быть, я просто сделал глупую ошибку? Заранее спасибо!

сообщения в схеме - это массив или объект? можете ли вы обновить вопрос с некоторыми существующими данными и ожидаемым результатом?

the_mahasagar 22.05.2019 03:24

@the_mahasagar Я добавил некоторые существующие данные. Я надеюсь, что это проясняет ситуацию.

meowsome 22.05.2019 03:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
230
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Надеюсь, это поможет: $push

Модель:

var MessagesSchema = new mongoose.Schema({
   title: {
     type: String,
     default: "Untitled Message Group"
   },
   members: {
     type: Array
   },
   unreadCounts: {
      type: Array
   },
   admins: {
     type: Array
   },
   messages: [{
      sender: {
        type: String
      },
      content: {
        type: String
      },
      date: {
        type: Number
      }
   }]
 });

Существующие данные:

{
  "_id" : ObjectId("5ce4990a11fa8f0d6e27344a"),
  "messages" : [
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "1st message sent",
        "date" : 1558485260497
    },
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "2nd message sent",
        "date" : 1558485261095
    },
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "3rd message sent",
        "date" : 1558485261446
    }
   ]
 }

Запрос :

db.messages.updateOne({
   "_id": ObjectId("5ce4990a11fa8f0d6e27344a")
},{
   $push: {
        messages: {
            $each: [{sender:"5c4ba709701212087e4d1bc9" , content: "4th message sent", date: Date.now()}],
            $sort: {date: -1}
        }
    }
 })

После результата запроса:

{
  "_id" : ObjectId("5ce4990a11fa8f0d6e27344a"),
  "messages" : [
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "4th message sent",
        "date" : 1558575451749
    },
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "3rd message sent",
        "date" : 1558485261446
    },
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "2nd message sent",
        "date" : 1558485261095
    },
    {
        "sender" : "5c4ba709701212087e4d1bc9",
        "content" : "1st message sent",
        "date" : 1558485260497
    }
 ]
}

Спасибо за идею, но разницы нет. Элементы по-прежнему добавляются в конец массива.

meowsome 23.05.2019 02:27

Я обновил ответ выводом запроса! это правильно то, что вы хотите.?

the_mahasagar 23.05.2019 03:43

Проблема заключается в модели, в которой сообщения являются Object! Вам нужно изменить это на Array. Я обновил ответ с изменениями модели.

the_mahasagar 23.05.2019 04:11

Удивительно, большое спасибо. У меня был хороший метод $push, но проблема заключалась в том, что мне нужно было изменить сообщения в модели с объекта на массив. Я не понимал, что есть разница при их определении, я новичок в этом. Спасибо!

meowsome 23.05.2019 19:42

Другие вопросы по теме