mongoose更新嵌套值

时间:2016-09-09 09:57:55

标签: javascript node.js mongodb mongoose

我的mogoose架构上有一些嵌套属性,如下所示:

const userSchemaValues = {
    username: {
        type: String,
        required: [true, 'Username required'],
        trim: true,
        unique: true,
        lowercase: true
    },
    password: {
        type: String,
        required: [true, 'Password required'],
        trim: true,
        minlength: 8
    },
  
 ...
  
    prop: {
        prop_1: String,
        prop_2: String
    }
};

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
	log.debug(JSON.stringify(valuesToUpdate));

	User.update({_id: req.params.id}, {$set: valuesToUpdate})
		.then((data) => {
			return res.json({message: data});
		})
		.catch(err => {
			log.error(err);
			return next({message: 'Error updating User.'});
		});

但是当我对prop_1和_2设置了一个像这样的对象(User.update({_id: req.params.id}, {$set: valuesToUpdate}))的用户{"prop":{"prop_1": "somevalue"}时,它不会寻找支柱中的内容,它只是覆盖它。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:2)

您的查找需要包含要更新的属性。此更新语句还需要Positional Update Operator将其更改为(超出我的头脑):

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
    log.debug(JSON.stringify(valuesToUpdate));

    User.update({$and : [{_id: req.params.id}, {prop.prop1 : "%oldvalue%"}]}, {$set: { "prop.$.prop1" : "%newvalue""}})
        .then((data) => {
            return res.json({message: data});
        })
        .catch(err => {
            log.error(err);
            return next({message: 'Error updating User.'});
        });

请注意,位置更新仅更新FIRST事件!

更新:重新阅读你的问题后,我看到道具不是阵列...我很抱歉。 幸运的是,这使得它变得更容易:)

您不需要该字段出现在查找中 对于集合:{$ set:{" prop.prop1" :" newvalue" } 此外,位置更新不是必需的,因为它不是数组。

这使得以下内容:

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));

User.update({_id: req.params.id}, {$set: { "prop.prop1" : "%newvalue%"}})
    .then((data) => {
        return res.json({message: data});
    })
    .catch(err => {
        log.error(err);
        return next({message: 'Error updating User.'});
    });

更新2:有关更新声明的更多信息。

由于评论,我将澄清更新命令。 如果要更新文档中的字段,请使用$set命令。 这会更新一个或多个字段。 如果要更新多个字段,可以使用以下命令执行此操作:

$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : "newvalueforprop2"} }

但是当您使用上面的命令并指定一个字段时,它会生成如下命令:

$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : null} }

这是关于如何创建更新命令的全部内容。如果您不知道它的1或2属性是否需要更新代码,那么它会动态生成命令。 但你可以做的另一件事是让mongoose处理更新。

使用类似:

User.findById(req.params.id, function (err, user) {
        if (err) {
            handleError(err)
        }
        else {
            //you should to some checking if the supplied value is present (!= undefined) and if it differs from the currently stored one
            user.prop.prop1 = "your value";
            user.prop.prop1 = "2nd value"

            user.save(function (err) {
                if (err) {
                    handleError(err)
                }
                else {
                    res.json(user);
                }
            });
        }
    });

希望现在明白。