如果不将 Id 推入数组,如何检查 mongodb 数组中是否存在 Id

How to check if an Id exist in mongodb array if not push the Id into the array

我在模式设计中使用 mongoose 我想检查用户集合是否存在数组中的设备 ID 如果错误则将设备推送到用户设备数组中

这是 ma 用户架构

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var deviceSchema = mongoose.Schema(
{
    macAddress: {type: String, required: true, unique: true},
    createdAt: {type: Date, default: Date.now},
}
)
var Device = mongoose.model('Device', deviceSchema);

module.exports = Device;

这是我的用户模式

var mongoose = require('mongoose');
var Schema = mongoose.Schema;


var userSchema = Schema(
{
    firstname: {type: String, required: true},
    lastname: {type: String, required: true},
    email: {type: String, required: true, unique: true},
    username: {type: String, required: true, unique: true},
    password: {type: String, required: true},
    createdAt: {type: Date, default: Date.now},
    devices: [{ type: Schema.Types.ObjectId, ref: 'Device1' }]
}
)

var User = mongoose.model('User', userSchema);

module.exports = User;

这是我的 nodejs 路由器

router.post('/user/device/:username', function(req, res, next) {
 if(!req.body.macAddress) {
    sendJSONresponse(res, 400, {
        "message": "Device Mac-Address required"
    });
    return;
}
 User.findOne({ username: req.params.username }, function(err, user) {
  if (err) { return next(err); }
  if (!user) { return sendJSONresponse(res, 400, {
        "message": "user not found"
    });
  }
        Device.findOne({macAddress : req.body.macAddress},    function(err, device){
        if(err){return next(err);}
        if(!device){
           sendJSONresponse(res, 400, {
                "message": "No device with that macaddress"
            });
           return;
        }
        User.find({ devices: { $elemMatch: { $eq: req.body.macAddress} } }, function(err, users){
                if(err){return next(err);}
                if(users){
                    sendJSONresponse(res, 400, {
                        "message": "Device already assigned to a user"
                    });
                    return;
                }else{
                    user.devices.push(device._id);
                      user.save(function(err) {
                        if(err){return next(err);}
                        sendJSONresponse(res, 200, user);
                      });
                }
            });

    });
  });
});

完成所有这些操作后,当我尝试将 api 与邮递员一起使用时,它告诉我服务器无法发送响应:请帮我修复我的代码

使用调试器逐步检查代码,看看发生了什么。如果您不知道如何调试,请查看https://code.visualstudio.com/docs/editor/debugging。这是一个免费工具。

您正在将设备 ID 推送到设备数组

user.devices.push(device._id)

但您正在尝试 elemMatch macAddress

User.find({ devices: { $elemMatch: { $eq: req.body.macAddress} } }..

什么时候应该

User.find({ devices: { $elemMatch: { $eq: device._id} } }..

您必须将 elemMatch 参数更改为 device._id 以使其正确。

router.post('/user/device/:username', function(req, res, next) {
    if(!req.body.macAddress) {
        sendJSONresponse(res, 400, {
            "message": "Device Mac-Address required"
        });
        return;
    }
    User.findOne({ username: req.params.username }, function(err, user) {
        if (err) { return next(err); }
        if (!user) { return sendJSONresponse(res, 400, {
            "message": "user not found"
        });
        }
        Device.findOne({macAddress : req.body.macAddress},    function(err, device){
            if(err){return next(err);}
            if(!device){
                sendJSONresponse(res, 400, {
                    "message": "No device with that macaddress"
                });
                return;
            }
            User.find({ devices: { $elemMatch: { $eq: device._id} } }, function(err, users){
                if(err){return next(err);}
                if(users){
                    sendJSONresponse(res, 400, {
                        "message": "Device already assigned to a user"
                    });
                    return;
                }else{
                    user.devices.push(device._id);
                    user.save(function(err) {
                        if(err){return next(err);}
                        sendJSONresponse(res, 200, user);
                    });
                }
            });

        });
    });
});