mongodb中$push和$pull的使用,向内嵌的数组中删除和添加元素
假设在集中在存在如下数据:
{ "_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中的占位符,也就是说当我们指定一个位置或匹配到一个元素之后,这个符号会自动指向平级的元素来进行操作,
push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用addToSet
需求2:
删除内嵌数组中的某一元素:
this.model.findOneAndUpdate( { "results._id":mongoose.Types.ObjectId(ancestors_id) }, { $pull: { "results.$.relation_kr_draft":{ _id: { $in : arr } } } } );
同样的,我们在这里还是使用了$占位符,在我们匹配到元素之后,占位符也自动匹配
mongo 查找对象数组中某一个或几个匹配的属性用 $elemMatch
new_parttime_positions: { $elemMatch: { position: ai.position.position_direct_superior, start_time: { $lte: moment().toDate() }, end_time: { $gte: moment().toDate() } } }
原文链接:https://blog.csdn.net/qq_42427109/article/details/89426172