【问题标题】:How to check if an Id exist in mongodb array if not push the Id into the array如果不将 Id 推入数组,如何检查 mongodb 数组中是否存在 Id
【发布时间】:2017-04-09 01:27:30
【问题描述】:

我在我的架构设计中使用 mongoose 我想检查用户集合,如果设备 id 存在于 am 数组中,如果错误将设备推送到用户设备数组中

这里是 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 完成所有这些操作后,告诉我服务器无法发送响应:请帮我修复我的代码

【问题讨论】:

  • 您正在将设备 ID 推送到设备数组(user.devices.push(device._id)) 但您正在尝试 elemMatch macAddress(User.find({ devices: { $elemMatch: { $eq : req.body.macAddress} } })。

标签: node.js mongodb mongoose-schema


【解决方案1】:

您正在将设备 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);
                    });
                }
            });

        });
    });
});

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为它是一个逻辑错误节点,请通过代码
    • 你可以自己做。看看一个工具。
    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多