У меня нет такого опыта работы с 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 Я добавил некоторые существующие данные. Я надеюсь, что это проясняет ситуацию.
Надеюсь, это поможет: $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
}
]
}
Спасибо за идею, но разницы нет. Элементы по-прежнему добавляются в конец массива.
Я обновил ответ выводом запроса! это правильно то, что вы хотите.?
Проблема заключается в модели, в которой сообщения являются Object! Вам нужно изменить это на Array. Я обновил ответ с изменениями модели.
Удивительно, большое спасибо. У меня был хороший метод $push, но проблема заключалась в том, что мне нужно было изменить сообщения в модели с объекта на массив. Я не понимал, что есть разница при их определении, я новичок в этом. Спасибо!
сообщения в схеме - это массив или объект? можете ли вы обновить вопрос с некоторыми существующими данными и ожидаемым результатом?