我正在使用Node.js,并且我使用Cloudant连接器作为环回的数据源。
我定义了一个名为User的模型,定义如下:
var User = db.define('User', {
lastName: { type: String },
firstName: { type: String },
skills: []
});
我有这个模型的实例,如:
{
"lastName": "Doe",
"firstName": "John",
"skills": [
{
"id": "0",
"text": "JAVA"
},
{
"id": "1",
"text": "CSS"
},
{
"id": "2",
"text": "HTML"
},
{
"id": 3,
"text": "JAVASCRIPT"
},
{
"id": 4,
"text": ".NET"
}
],
"id": "d981b42c3a2a13da382102c76652b96e"
}
我想更新实例,以便技能数组只包含以下信息:
"skills": [
{
"id": "0",
"text": "JAVAFX"
},
{
"id": "1",
"text": "CSS3"
}
]
我想使用这个功能:
app.post('/updateProfile', function(req, res) {
User.updateAll(
{_id:req.body.id},
{skills: req.body.skills},
function(err,items){
if(err){
res.send(err);
} else {
res.sendStatus(200);
}
});
});
但是,我面临的问题是只更新具有相同ID的技能。我想删除的那些(在示例中它的HTML,JAVASCRIPT和.NET)不会被删除。
我如何才能真正取代技能而不仅仅是更新?我已尝试过文档中描述的其他一些内容,但它无法正常工作。 Documentation is available here
答案 0 :(得分:1)
确认它是loopback-connector-cloudant中的一个错误。 提起了一个错误:https://github.com/strongloop/loopback-connector-cloudant/issues/44
其他环回数据源,如"内存"将替换整个skills
对象,它可以正常工作。
作为一种解决方法,您可以使用一个methond User.replaceById(id, {data}, cb)
来替换整个技能属性。
补丁仍在验证中,尚未发布,只要发布时我会在此处更新:https://github.com/strongloop/loopback-connector-cloudant/pull/34
所以在你的情况下,它应该是
User.replaceById('d981b42c3a2a13da382102c76652b96e', {
"lastName": "Doe",
"firstName": "John",
"skills": [
{
"id": "0",
"text": "JAVAFX"
},
{
"id": "1",
"text": "CSS3"
}
]
}, function(err, replacedInstance){
// get your replaced instance here
})
此方法的一个限制是您必须在更新数据中包含未更改的属性,例如lastName
,firstName
。