如何使用猫鼬中的“保存”功能更新子文档?
问题描述:
我的问题有点幼稚,但到处搜索后我找不到答案。如何使用猫鼬中的“保存”功能更新子文档?
我有user
name: {type:String},
relations: [{
entity: mongoose.Schema.Types.ObjectId,
year: {type:Number}
}]
的模式我想relations.entity
= R1更新用户的年
我能够与update
功能
var toupdate = {}
toupdate["relations.$.year"] = 1900;
User.update({'relations.entity': 'R1'},{"$set": toupdate},
function(err,results){
// console.log(results);
});
进行更新
虽然这个效果很好,但我想使用.save()
方法,因为我有其他已经更新过的字段。
User.find({_id:"myid"},function(err,user){
user.name = "my new name";
// find the relation matching the relations.entity = "R1"
user.save(function(err,results){
// send my results returned
});
})
如何在致电save()
之前编写逻辑?
答
var year = 1900;
var entity = "R1"
User.find({_id:"myid"},function(err,user){
user.name = "my new name";
if (user.relations && Object.prototype.toString.call(user.relations) === '[object Array]') {
user.relations.forEach((relation, index , relations) => {
if(relation.entity === entity ) {
relations[index].year = year;
}
})
}
// find the relation matching the relations.entity = "R1"
user.save(function(err,results){
// send my results returned
});
})
对于多关系更新,您可以更改实体阵列,通过的indexOf更新一年。
答
User.findOne({_id:"myid"},function(err,user){
user.name = "my new name";
var tmp = user.relations;
_.forEach(tmp,function(aObj){
if(aObj.entity == 'R'){
aObj.year = 1900;
}
});
user.relations = tmp;
user.save(function(err,results){
});
});
答
User.findOne({_id:"myid"})
.deepPopulate('relations.entity')
.exec(function(err,user) {
user.name = "my new name";
var tmp = user.relations;
_.forEach(tmp,function(aObj){
if(search variable path == 'R'){
aObj.year = 1994;
}
});
user.relations = tmp;
user.save(function(err,results){
console.log("results",results);
});
});
'关系'是一个对象数组,而不是单个对象。它没有字段'_id'。我看到的唯一ID是来自'entity'。 – Mikey
它有一个'_id'字段,看起来像猫鼬正在创建它,虽然没有在模式中定义。 – Masade
你只需要找到数组并更新index处的值。像'User.find({_ ID: “身份识别码”, 'relations.entity': 'R1'},功能(ERR,用户){ user.name = “我的新名字”; \t \t \t \t指数= user.relations.findIndex((关系=> relation.entity == 'R1')); \t \t \t \t user.relations [指数] .year = 1900; user.save(功能(ERR,结果){ }); })' – Veeram