从对象数组中的对象中删除属性mongoose

时间:2022-09-25 07:54:24

I have a MongoDB document like this:

我有一个像这样的MongoDB文档:

{
"_id": ObjectId("5589044a7019e802d3e9dbc5"),
groups:[{
    _id: 5a3326d01b2213894672fdd0,
    group_id: '13239517',
    thread_id: 'f32940da-12-15-01-9325790',
    Last_post_id: '981206845'}]
}

I've tried a variation of $set and $unset using:

我尝试使用$ set和$ unset的变体:

User.findOneAndUpdate({userId}, {groups:{$set: {thread_id: ''}}}, {new: true})

when I tried multiple variations of the above code I keep on getting groups where the affected object is only left with an id.

当我尝试上述代码的多个变体时,我继续获取受影响对象仅留有id的组。

[ { _id: 5a3326d41b2213894672fdd1 },
{ _id: 5a332a81479a728ebe4226e5,
group_id: '13239517',
thread_id: 'f32940da-12-15-01-9325790',
Last_post_id: '981206845' } ]

I've also tried looping over the array of groups removing the key using reduce then just trying to set the groups to this new values like and that didn't work either.

我也试过循环使用reduce删除密钥的组数组然后只是尝试将组设置为这样的新值,这样也不起作用。

let groups = groups.reduce((prev, ele)=>{
  // group_id is passed in as an argument
  if(ele.group_id === group_id){
    let chatThread = ele.thread_id
    delete ele.thread_id
    console.log(ele)
    return chatThread
  } else {
    return prev
  }
}, false)
User.findOneAndUpdate({userId}, {groups}, {new: true})

this just doesn't do anything.

这只是没有做任何事情。

My intended result would be where thread_id is gone

我的预期结果将是thread_id消失的地方

groups:[{
_id: 5a3326d01b2213894672fdd0,
group_id: '13239517',
Last_post_id: '981206845'}]

Although similar to link1 and link2 both of those solutions either don't change anything when saved or remove all properties other than _id.

虽然类似于link1和link2,但这些解决方案在保存时都不会更改任何内容,也不会删除除_id以外的所有属性。

1 个解决方案

#1


0  

this did work for me. looks like reduce and map when using delete keyword will not affect the original array I assumed it would since i thought it was passed by reference.

这确实对我有用。当使用delete关键字时看起来像reduce和map不会影响原始数组我认为它会因为我认为它是通过引用传递的。

User.findOne({userId}, async(err, user)=>{
            let new_groups = user.groups.map(ele=>{
              // group id is passed as an argument
              if(ele.group_id === group_id){
                return {
                  group_id:ele.group_id,
                  _id: ele._id,
                  Last_post_id: ele.Last_post_id
                }
              }
              return ele
            })
            var updateUserGroups = await User.findOneAndUpdate({userId}, {groups: new_groups}, {new: true})

#1


0  

this did work for me. looks like reduce and map when using delete keyword will not affect the original array I assumed it would since i thought it was passed by reference.

这确实对我有用。当使用delete关键字时看起来像reduce和map不会影响原始数组我认为它会因为我认为它是通过引用传递的。

User.findOne({userId}, async(err, user)=>{
            let new_groups = user.groups.map(ele=>{
              // group id is passed as an argument
              if(ele.group_id === group_id){
                return {
                  group_id:ele.group_id,
                  _id: ele._id,
                  Last_post_id: ele.Last_post_id
                }
              }
              return ele
            })
            var updateUserGroups = await User.findOneAndUpdate({userId}, {groups: new_groups}, {new: true})