2015-02-28 3 views
0

Я пытаюсь использовать 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" 
      }, 

     ] 
    }], 

} 

Я действительно изо всех сил, как вставить новую запись :(Может кто-нибудь помочь, пожалуйста?

ответ

1

Вопрос заключается в том, что вы настраиваете каждый PrivateMessage _id в _id пользователя, не делайте этого !

EDIT:.

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) { 
       users[i].with.forEach(function(with){ 
        if (with.conversation_with === to){ 

         // append new message 
         with.messages.push({ 
          text: message, 
          created: { type: Date, default: Date.now } 
         }) 
        } 
       }) 

       users[i].save (function (err) { 
        if (err) throw err; 
       }); 

      } 
     } 
    }); 
}); 
+0

благодаря @Yuri, но ваше решение является добавление нового элемента, каждый раз, когда для одного пользователя, мне нужно, чтобы сохранить тот же элемент для того же пользователя и просто добавить новое сообщение для это конкретное лицо n в 'convers_with: to' –

+0

Итак, ваш исходный вопрос связан с вставками, но то, что вы на самом деле хотите, - это обновление с возможной вставкой (если оно не существует?). Я обновил свой ответ, чтобы показать вам, как это можно сделать. Но вам, вероятно, придется изменить его, чтобы включить условие, при котором session_with не соответствует «to», и в этом случае вам нужно будет создать его. Я настоятельно рекомендую вам упростить вашу схему, вам не нужны 2 вложенных массива. –

+0

большое спасибо @ Юри, это то, что мне нужно. Ты удивительный. Хотя, я просто понял, что схема может быть не лучшим решением для хранения разговора между двумя людьми, поскольку я сохраняю только сообщения одного человека, тогда мне нужно получить оба сообщения пользователей. Мне нужно работать над этим. Но в любом случае, спасибо еще раз. –