mongodb中$push和$pull的使用,向内嵌的数组中删除和添加元素

22 篇文章 0 订阅
14 篇文章 0 订阅

假设在集中在存在如下数据:

{
	"_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 
                            }
                }
            }
        }
        );

同样的,我们在这里还是使用了$占位符,在我们匹配到元素之后,占位符也自动匹配

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值