Я пытаюсь использовать MongoDB и мангуста для моего маленького приложения разговор в котором каждый пользователь, имеющий свою собственную коллекцию, но я при сохранении нового сеанса получаю сообщение об ошибке:Mongoose и MongoDB - дубликат ключа ошибки
оШИБКА: MongoError: insertDocument :: вызвано :: 11000 E11000 дубликат ключа индекса ошибки:. chat.privatemessages $ ID DUP ключ: {: ObjectId ('54f1a39ff467833f7e794636')}
Моя схема:
var chatPrivateMessagesSchema = mongoose.Schema({
user: String,
with:[{
conversation_with: String,
messages:[{
text:String,
created: {type: Date, default: Date.now}
}]
}]
});
var PrivateMessages = mongoose.model('PrivateMessages', chatPrivateMessagesSchema);
метод для сохранения нового разговора:
socket.on ('chat', function (from, to, message, callback) {
PrivateMessages.find ({}, function (err, users) {
if (err) throw err;
for (var i = 0; i < users.length; i++) {
if (users[i].user == from) {
var newPrivateMsg = new PrivateMessages ({_id: users[i]._id}, {
with: [{
conversation_with: to, //if conversation with "to" user does not exist create a new entry
messages: [{
text: message, //append a new message
created: {type: Date, default: Date.now}
}]
}]
});
newPrivateMsg.save (function (err) {
if (err) throw err;
});
}
}
});
});
Так в основном на выходе я ищу должно быть что-то вроде этого?
{
"_id": "some id",
"user": "John",
"with": [{
"conversation_with": "Maria",
"_id": "some id",
"messages": [{
"text": "Hellomyfisrtmessage",
"created": "somedate"
}, {
"text": "Secondmessage ",
"created": "somedate"
}, {
"text": "Thirdmessage",
"created": "somedate"
}, ]
}, {
"conversation_with": "Peter",
"_id": "some id",
"messages": [{
"text": "Hellomyfisrtmessage",
"created": "somedate"
}, {
"text": "Secondmessage ",
"created": "somedate"
}, {
"text": "Third message",
"created": "some date"
},
]
}],
}
Я действительно изо всех сил, как вставить новую запись :(Может кто-нибудь помочь, пожалуйста?
благодаря @Yuri, но ваше решение является добавление нового элемента, каждый раз, когда для одного пользователя, мне нужно, чтобы сохранить тот же элемент для того же пользователя и просто добавить новое сообщение для это конкретное лицо n в 'convers_with: to' –
Итак, ваш исходный вопрос связан с вставками, но то, что вы на самом деле хотите, - это обновление с возможной вставкой (если оно не существует?). Я обновил свой ответ, чтобы показать вам, как это можно сделать. Но вам, вероятно, придется изменить его, чтобы включить условие, при котором session_with не соответствует «to», и в этом случае вам нужно будет создать его. Я настоятельно рекомендую вам упростить вашу схему, вам не нужны 2 вложенных массива. –
большое спасибо @ Юри, это то, что мне нужно. Ты удивительный. Хотя, я просто понял, что схема может быть не лучшим решением для хранения разговора между двумя людьми, поскольку я сохраняю только сообщения одного человека, тогда мне нужно получить оба сообщения пользователей. Мне нужно работать над этим. Но в любом случае, спасибо еще раз. –