如何在mongoose中找到特定数组中的两个数据?

时间:2016-01-30 23:39:25

标签: mongodb mongoose

我已将用户的数据保存在数组中。猫鼬模型是

var RoomSchema = new Schema({
  users: [{
    type: Schema.Types.ObjectId, ref: 'User',
  }]
});

用户数组一次可容纳2个用户。

我的目标是查询,

如果用户A和用户B存在于数组中,那么只需console.log(“Room Exist”),否则如果两者都不在数组中那么只需创建一个新房间

我目前的尝试。

router.post('/api/create-room', function(req, res, next) {
  Room.findOne({
    $and : [userA, userB]
  }, function (err, foundRoom) {
    if (foundRoom) {
      console.log('Room Already Exist');
      //return res.json('Room Already Exist');
    } else {
      var room = new Room();
      room.users.push(userA, userB);
      room.save(function(err) {
        if (err) return next(err);
        console.log('Room Created');
        //return res.json('Room created');
      });
    }
  });
});

问题在于它总是会创建一个新房间,这意味着即使我已经将用户A和用户B推送到阵列中,它也找不到房间里的那2个用户。

数据

enter image description here

2 个答案:

答案 0 :(得分:3)

如果您只想查找数组中存在的两个值,请对数组元素使用$all表达式。这实际上是一个"和"条件,适用于同一元素。只需确保userAuserB是ObjectID值或至少是有效字符串:

Room.findOne({ "users": { "$all": [ userA, userB ] } },function(err, foundRoom) {
    // rest of logic in here
});

如果您的目的只是为了创建一个没有该用户组合的新房间,那么您可以在一次调用中真正完成此操作,如下所示:

Room.findOneAndUpdate(
    { "users": { "$all": [ userA, userB ] } },
    { "$addToSet": { "users": { "$each": [ userA, userB ] } } },
    { "upsert": true, "new": true, "passRawResult": true },
    function(err,newRoom,raw) {
        if ( raw.value.lastErrorObject.updatedExisting == true ) {
            // Then the room was already found
        } else {
            // newRoom has the updated object data
        }
    })
)

所以基本情况是使用.findOneAndUpdate()这是一个操作。通过查看" rawResult"从那里的选项,然后您可以判断是否创建了新文档。

$addToSet确保在匹配时不会添加任何新内容。但您可以使用$setOnInsert代替。

这更有意义,因为你只与数据库交谈一次。

答案 1 :(得分:0)

或者说错误你只是说用[userA,userB]找到一个房间这个条件似乎是错误的我认为你必须定义必须正确搜索的字段试试

router.post('/api/create-room', function(req, res, next) {
   Room.findOne()
    .and([
      {users: userA._id},
      {users: userB._id}
    ])
    .populate('users')
    .exec(function (err, foundRoom) {
             if (foundRoom) {
                   console.log('Room Already Exist');
                   //return res.json('Room Already Exist');
             } else {
                   var room = new Room();
                   room.users.push(userA, userB);
                   room.save(function(err) {
                   if (err) return next(err);
                           console.log('Room Created');
                   //return res.json('Room created');
             }
           })
       })
})