2017-01-30 118 views
0

基本上我正在开发一个聊天应用程序,这个猫鼬模式表示一个用于2个用户之间的私人聊天的模式。

即时尝试做的是检查从客户端 给出的id1和id2是否在我的私人聊天数据库集合中。问题是这个mongoDB查询无法正常工作,并且这些用户标识已经存在于聊天文档中。用户1和用户2中的相同_id创建了一个新的聊天文档,只是这次逆转了。这就是为什么我需要$or运营商,但正如我打算

const chatSchema = new Schema({ 

     user1: { 

      _id: String, 
      username: String, 
      fullName: String 
     }, 
     user2: { 

      _id: String, 
      username: String, 
      fullName: String 
     }, 
     messages: [ 
      { 
       _id: false, 
       author: String, 
       text: String, 
       date: Number 
      } 
     ] 

    }); 

所以这是我的实现,以检查是否用户之间的这种关系已经存在我的查询不起作用。如果它没有创建文档并保存它,则会执行某些操作。 data.user._id代表用户的ID,data.friend._id代表您正在聊天的用户的ID。

Chat.count(
     { 
      $or: [ 
       { 
        user1: { 
         _id: data.user._id 
        }, 
        user2: { 
         _id: data.friend._id 
        } 
       }, 
       { 
        user2: { 
         _id: data.user._id 
        }, 
        user1: { 
         _id: data.friend._id 
        } 
       } 
      ] 
     }, (err, count) => { 
      if (!count) { 
       new Chat({ 
        user1: data.user, 
        user2: data.friend, 
        messages: [] 
       }).save((err, data) => { 
        if (err) { 
         console.log(err); 
        } 
        socket.join(data._id); 
        socket.emit('chats', data); 
       }); 
      } 
     }); 

回答

1

您需要使用MongoDB dot notation来查询$或操作符。

在$试试这个或

{ 
     $or: [ 
      { 
       "user1._id": data.user._id,      
       "user2._id": data.friend._id      
      }, 
      { 
       "user2._id": data.user._id,      
       "user1._id": data.friend._id  
      } 
     ] 
    } 

按照文档: -

要指定或访问与点符号嵌入文档的领域,与点串连嵌入文档名称(。)和字段名称,并附上引号:

+1

另外,我建议您使用findOne而不是使用相同$或条件的Count。如果声明适用(错误或返回的文档,或者两者都不存在),但现在您可以返回套接字中的现有实例文档,以便可以将新数据附加到消息数组。 – SylonZero

+0

正是我所做的感谢 –