2013-07-17 132 views
3

我有1 - 用户和设备(嵌入在用户模式)查询猫鼬文档内的阵列

var UserSchema = new Schema({ 
    devices: [DeviceSchema] //list of devices for the user  
}) 

var DeviceSchema = new Schema({ 
    deviceRegistrationId: String, 
    deviceOSType: String 
}); 

之间一对多关系我有一个休息快递POST/API /设备呼叫(用户ID是在标题中提供)将设备添加到用户集合中,我只想在设备尚未存在于用户模型中时添加设备。后调用的身体会像

{ deviceRegistrationId : "xx2233", 
    deviceOSType: "Android" 
} 

我检查是否用户ID在头用户集合中存在,如果它确实存在,添加仅在设备未在数据库中的设备。

我目前的实施情况如下。

var userId = req.header('UserId'); 
     var deviceRegistrationId = req.body.deviceRegistrationId; 
     User.findById({_id: userId}, function(err, user) { 
      if (user && user!==undefined) { 
       if (UserController.containsDevice(user.devices, deviceRegistrationId)) { 
        console.log('contains device - do nothing '); 
        res.send({errors: [{code: 666, message: 'Device Already Registered'}]}) 
       } else { 
        user.devices.addToSet(req.body); 
        user.save(); 
        //todo check what to send back.. 
        res.send(user); 
       } 
      } else { 
       res.send({errors: [{code: 666, message: 'User not found in the database'}]}); 
      } 

      if (err) 
       res.send({errors: [{code: 666, message: 'Unexpected issue in User Collection'}]}); 
     }); 


UserController.containsDevice = function(devices, deviceRegistrationId){ 
     console.log('UserController::containsDevice devices: ' + JSON.stringify(devices) + 
        " deviceRegistrationId: " + deviceRegistrationId); 
     var strDeviceRegistrationId = "" + deviceRegistrationId; 
     for (var i = 0; i < devices.length; i++) { 
      console.log(' device id :' + JSON.stringify(devices[i].deviceRegistrationId)); 
      if (devices[i].deviceRegistrationId == strDeviceRegistrationId) { 
       console.log('id matched'); 
       return true; 
      } 
     } 

      return false;   

    } 

我想检查是否有一种方式不是设备数组来确定设备是否已经存在。

回答

7

您可以在查询中使用点分隔路径,例如:User.find({'devices.deviceRegistrationId': deviceRegistrationId})。如果该查询与任何文档都不匹配,则没有用户拥有该设备。注意,mongo足够聪明,可以在给出这样的查询时测试devices数组的所有成员。如果要检查特定用户,还可以将用户标识添加到查询条件中。

+2

如何查询文本项的数组 – r3wt