MongodDB Mongoose Collection.findAndModify Upsert:ture

时间:2016-10-08 00:18:43

标签: node.js mongodb express mongoose

我正在尝试为NodeJS,Express,MongoDB应用的用户添加基本的用户到用户消息服务。

我有两个MongoDB文档用于该功能:a' Messages'包含每条消息的文档,以及“对话”和“对话”。文档,它将引用所有'消息'属于它。

因此,一旦消息到达服务器,我想为发件人和收件人的对话做一个findAndModify。如果存在此类会话,则使用新消息更新它。如果对话不存在,则创建它然后添加消息。

app.post('/messages', function(req, res){
  var message = { // Create an object with the message data
    sender: req.body.sender,
    recipient: req.body.recipient,
    messageContent: req.body.msgCont,
    timeSent: Date.now()
  };
  Message.create(message, function(err, newMessage){ // Add the message to MongoDB
    if(err){
      console.log('Error Creating Message' + Err);
    } else {
      console.log("The New Message " + newMessage)
      Conversation.findOneAndUpdate({ // Find a conversation with both the sender
        $and: [                       // and receiver as participants (there should
        {$or: [                       // only ever by one such conversatoin)
          {"participants.user1.id" : req.body.sender},
          {"participants.user1.id" : req.body.recipient}
        ]},
        {$or: [
          {"participants.user2.id" : req.body.sender},
          {"participants.user2.id" : req.body.recipient}
        ]},
      ]}, {$setOnInsert : {
                            messages : message, 
                            "participants.user1.id" : req.body.sender,
                            "participants.user2.id" : req.body.recipient
                          },
      new : true,
      upsert : true
    }, function(err, convo){
        if(err){
          console.log(err + 'error finding conversation')
        } else {
          console.log("Convo " + convo)
        }
      });
    }
  });
  res.redirect('/matches');
});

将消息添加到数据库工作正常,但是对话查询的某些内容不起作用。我得到了Convo null的console.log,因此它没有返回错误,但没有任何内容进入对话。

如果有人能看到我出错的地方,我会对某些指导感到非常满意!

1 个答案:

答案 0 :(得分:0)

MongoDB findOneAndUpdate方法(documentation)没有new选项,而是returnNewDocument。此外,您缺少这些选项的大括号

{
  returnNewDocument: true,
  upsert: true
}