如何推送到猫鼬中的数组

Posted

技术标签:

【中文标题】如何推送到猫鼬中的数组【英文标题】:How to push to an array in mongoose 【发布时间】:2016-01-29 19:51:10 【问题描述】:

我有这个代码:

router.post('/setsuggestions', function(req, res, next)
  if(!req.body.username || !req.body.challengessuggestions)
    return res.status(400).json(message: challengessuggestions);
  

  var query =  username: req.body.username ;
  /*User.findOneAndUpdate(query,  challengessuggestions: req.body.challengessuggestions , callback = function(response)
    res.json(response);
  );*/
/*
  User.findOneAndUpdate(
    query,
    $push: "challengessuggestions": $oid: req.body.challengessuggestions,
    callback = function(response) 
        res.json(response);
    
    );*/

  User.findOneAndUpdate(
    query,
    $push: challengessuggestions: req.body.challengessuggestions,
    safe: true, upsert: true,
    function(err, model) 
         res.json(err);
    
);


);

当我这样邮递员时:

我收到以下错误:

"name": "MongoError", "message": "异常:字段 'challengesuggestions' 必须是一个数组,但属于 OID 类型 文档 _id: ObjectId('56263b910d1a2f1f0077ffae')", "errmsg": “例外:字段 'challengesuggestions' 必须是一个数组,但 文档中的 OID 类型 _id: ObjectId('56263b910d1a2f1f0077ffae')", “代码”:16837,“确定”:0

这是 AppUser 的架构定义:

var UserSchema = new mongoose.Schema(
    username:  type: String, lowercase: true, unique: true ,
    firstname:  type: String,
    lastname:  type: String,
    difficulty:  type: String,
    isstudent:  type: Boolean ,
    haschildren:  type: Boolean,
    gender:  type: String ,
    email:  type: String, unique: true,
    birthdate: String,
    isdoingchallenges:  type: Boolean ,
    challengescompleted: [ type: ObjectId, ref: 'Challenge' ],
    currentchallenge:  type: ObjectId, ref: 'Challenge' ,
    challengessuggestions: [ type: ObjectId, ref: 'Challenge' ],
    hash: String,
    salt: String
);

这是挑战的模式定义:

var Challengeschema = new mongoose.Schema(
    name:  type: String,  initial: true, required: true, index: true ,
    image:  type: Array ,
    difficulty:  type: String ,
    studentfriendly:  type: Boolean ,
    childfriendly:  type: Boolean ,
    description:  type: String 
);

我在调用 api 的函数中发送这个:

对象_id:“5631423f8c5ba50300f2b4f6”,难度:“中等”,名称: “Probeer 1 van onze recepten.”,__v:0,childfriendly: true…

这给了我以下错误:

D:\Stijn\Documenten\EVA-project-Groep-6\Api\node_modules\mongoose\lib\schema\obj ectid.js:134 throw new CastError('ObjectId', value, this.path); ^ 错误 在 MongooseError.CastError (D:\Stijn\Documenten\EVA-project-Groep-6\Api\node _modules\mongoose\lib\error\cast.js:18:16) 在 ObjectId.cast (D:\Stijn\Documenten\EVA-project-Groep-6\Api\node_modules\m ongoose\lib\schema\objectid.js:134:13) 在 Array.MongooseArray.mixin._cast (D:\Stijn\Documenten\EVA-project-Groep-6\ Api\node_modules\mongoose\lib\types\array.js:124:32) 在 Array.MongooseArray.mixin._mapCast (D:\Stijn\Documenten\EVA-project-Groep -6\Api\node_modules\mongoose\lib\types\array.js:295:17) 在 Object.map (本机) 在 Array.MongooseArray.mixin.push (D:\Stijn\Documenten\EVA-project-Groep-6\A pi\node_modules\mongoose\lib\types\array.js:308:25) 在查询。 (D:\Stijn\Documenten\EVA-project-Groep-6\Api\routes\ind ex.js:144:44) 在 D:\Stijn\Documenten\EVA-project-Groep-6\Api\node_modules\mongoose\node_mo dules\kareem\index.js:177:19 在 D:\Stijn\Documenten\EVA-project-Groep-6\Api\node_modules\mongoose\node_mo dules\kareem\index.js:109:16 在 doNTCallback0 (node.js:408:9) 在 process._tickCallback (node.js:337:13) 10 月 29 日 22:05:38 - [nodemon] 应用程序崩溃 - 在启动之前等待文件更改...

我该如何解决这个问题?

【问题讨论】:

你能告诉我们架构定义吗? 【参考方案1】:

首先使用 findOne() 查询用户用户,然后使用传递给回调的第一个找到的文档来保存嵌入的文档:

router.post('/setsuggestions', function(req, res, next)
    if(!req.body.username || !req.body.challengessuggestions)
        return res.status(400).json(message: challengessuggestions);
    

    var query =  username: req.body.username ;

    User.findOne(query, function (err, user)       
        if (err) //throw ...
        if (user) 
            if (user.challengessuggestions && user.challengessuggestions.length) 
                user.challengessuggestions.push(req.body.challengessuggestions);
            
            else 
                user.challengessuggestions = [req.body.challengessuggestions];
            

            // save changes
            user.save(function (err) 
                if (!err) 
                    // done ...
                
            );
        
    );    
);

【讨论】:

我应该如何在邮递员中测试这个?使用 ObjectId("56313a951a99710300d9d13f") 作为挑战建议不起作用 您可以将日志记录 (console.log()) 放在逻辑中以查看返回的内容。

以上是关于如何推送到猫鼬中的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何通过一次调用将一组对象推送到猫鼬中的数组中?

将元素推送到猫鼬中的数组

如何在猫鼬中动态地将值推入对象的属性?

将文档推送到猫鼬模型数组中的子文档中

如何填充数组内的对象和猫鼬中的另一个数组中的所有用户字段

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?