假设在集中在存在如下数据:
{
"_id" : ObjectId("5cb6e53cb4276075a2262f5b"),
"results" : [
{
"current" : 7.45,
"origin" : 0,
"target" : 100,
"title" : "组织kr",
"type" : 2,
"director" : "c673e19320f1461d859f5c8703f7c47f",
"indepartmental_needs" : "组织kr",
"_id" : ObjectId("5cb7e9ba439a2716f888c14d"),
"arr" : [
{
"_id" : 1,
"kid" : 1,
"parent_id" : null
},
{
"_id" : 2,
"kr_id" : 2,
"parent_id" : 1
},
{
"_id" : 3,
"kr_id" : 3,
"parent_id" : 1
},
{
"_id" : 4,
"kr_id" : 3,
"parent_id" : 1
},
{
"_id" : 5,
"kr_id" : 1,
"parent_id" : 1
}
],
},
很明显,这个数据的结构是层层嵌套的,并且arr数组中存储了一个打平的父子相互引用的树结构,
需求1:
需要再向arr数组中添加元素:
this.model.findOneAndUpdate(
{
'results._id':mongoose.Types.ObjectId(body.ancestors)
},
{
$push:
{
"results.$.arr":
{
parent_id : 1,
kr_id : 1
}
}
},
{
upsert:true,
'new':true
} ,
(err,data)=>{
//return
}
);
$符号是mongodb中的占位符,也就是说当我们指定一个位置或匹配到一个元素之后,这个符号会自动指向平级的元素来进行操作,
p u s h 是 直 接 向 数 组 中 进 行 添 加 , 如 果 不 想 添 加 重 复 的 元 素 , 可 以 选 择 使 用 push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用 push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用addToSet
需求2:
删除内嵌数组中的某一元素:
this.model.findOneAndUpdate(
{
"results._id":mongoose.Types.ObjectId(ancestors_id)
},
{
$pull:
{
"results.$.relation_kr_draft":{
_id: {
$in : arr
}
}
}
}
);
同样的,我们在这里还是使用了$占位符,在我们匹配到元素之后,占位符也自动匹配