NodeJS 如何在MongoDB中更新嵌套数组

7gyucuyw  于 5个月前  发布在  Node.js
关注(0)|答案(1)|浏览(65)

我有一个更新函数,它在MongoDB文档中创建一个新的活动数组。“活动”数组中的每个活动都有一个“名称”和另一个名为“线索”的数组。
这就是我创建它的方式:

await users.updateMany(
  { email: user.email },
  { $push: { campaigns: { name: campaignname, type, leads: [] } } }
);

字符串
现在我想做的是“添加”一些数据(对象数组)到“线索”数组中,并指定活动名称。
因此,我基本上想搜索用户,通过“名称”字段选择活动数组中的活动,并将对象数组推到“线索”数组中。
我试探着:

await users.updateOne({
  $push: {
    "campaigns.$[elem].leads": { $each: leads }
  }
},
{
  arrayFilters: [
    {
      "elem.name": campaignname
    }
  ]
})


不起作用
请任何人及时帮助

a9wyjsp7

a9wyjsp71#

你可以这样做:

const doc = await users.findOneAndUpdate(
    {
        email: user.email,
        campaigns: {
            $elemMatch:{
                name: campaignname
            }
        }
    },
    {
       $push: {
          "campaigns.$.leads": {
             $each: [
                {key: 'value'},
                {key: 'value'}
             ]
          }
       }
}, {new: true}); //< {new: true} is mongoose specific

字符串
或者,如果你已经构造了要推送的对象数组,你可以使用spread语法:

const arr = [{key: 'value'}, {key: 'value'}]
const doc = await users.findOneAndUpdate(
    {
        email: user.email,
        campaigns: {
            $elemMatch:{
                name: campaignname
            }
        }
    },
    {
       $push: {
          "campaigns.$.leads": {
             $each: [
                ...arr
             ]
          }
       }
}, {new: true}); //< {new: true} is mongoose specific


要从campaigns.leads数组中删除其中一个对象,可以通过$pull{key: 'value'}选择它们,如下所示:

const doc = await users.findOneAndUpdate(
    {
        email: user.email,
        campaigns: {
            $elemMatch:{
                name: campaignname
            }
        }
    },
    {
       $pull: {
          "campaigns.$.leads": {
             key: 'value'
          }
       }
}, {new: true});


或者如果你只是想删除它们,你可以把campaigns.leads设置为一个空数组,如下所示:

const doc = await users.findOneAndUpdate(
    {
        email: user.email,
        campaigns: {
            $elemMatch:{
                name: campaignname
            }
        }
    },
    {
       $set: {
          "campaigns.$.leads": []
       }
}, {new: true});

相关问题