0

业务架构:

var BusinessSchema = new Schema({
    owners: {type: Array},
    templates:[{
        _id : ObjectId,
        title : String,
        path : String,
        custom_navigation : Boolean
    }]
});

业务集合如下所示:

{"owners" : [
        ObjectId("522fa2d61685d3f4ce000002")
    ],
    "templates" : [
        {
            "_id" : ObjectId("524c3bacc7ba62c549000004"),
            "custom_navigation" : true
        },
        {
            "_id" : ObjectId("524c3bacc7ba62c549000005")
        },
        {
            "_id" : ObjectId("524c3bacc7ba62c549000006")
        }
    ]}

更新存储在模板数组中的特定模板的函数:

        var Business = require('../models/business.js');

        Business.update({'owners' : req.user._id, "templates._id" : req.body._id}, {
            $set : {"templates.$.custom_navigation" : req.body.custom_navigation}
        },
        function(err, numUpdated){
            console.log(numUpdated);
            if(numUpdated > 0){
                res.json(200, req.body);
            }else{
                res.json(404);
            }
        });

当我输出函数的搜索参数时update,我看到:

{ owners: 522fa2d61685d3f4ce000002,
  'templates._id': '524c3bacc7ba62c549000004' }

请注意,Mongoose 似乎将 req.user._id 识别为 ObjectId,但 req.body._id 作为字符串传递。我尝试将其转换为 ObjectId 没有结果。update 语句总是更新模板数组中的第一项,无论 templates._id 设置为什么。

4

1 回答 1

0

您需要按 Object id 搜索,而不是按 req.body._id 搜索(我猜它是一个整数)

var templateId = require('mongoose').Types.ObjectId;
Business.update({'owners' : req.user._id, "templates" : {$elemMatch :{ _id: new templateId(req.body._id)}}},     
....
于 2013-10-02T16:41:49.690 回答