首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在双嵌套数组中添加或删除元素?

如何在双嵌套数组中添加或删除元素?
EN

Stack Overflow用户
提问于 2021-07-10 05:46:02
回答 1查看 165关注 0票数 1

文件示例:

代码语言:javascript
代码运行次数:0
运行
复制
{
    postId:'232323',
    post:'This is my first post',
    commentsOnPost:[
        {
            commentId:'232323_8888',
            comment:'Congrats',
            repliesOnPost:[
                {
                    replyId:'232323_8888_66666',
                    reply:'Thanks',
                    likesOnReply:['user1','user5','user3'],
                    
                }
            ]
        }
    ]
}

如果用户在userid中不存在,我希望在likesOnReply中添加userid,如果存在,则从likesOnReply中删除userid

我试过这样做,但工作不正常。

代码语言:javascript
代码运行次数:0
运行
复制
   await collection('post').findOneAndUpdate(
                {
                    postId: postId,
                    'commentsOnPost.commentId': commentId,
                    'commentsOnPost.repliesOnPost.replyId': replyId
                },
                {

                    $push: { 'commentsOnPost.$[].repliesOnPost.$.likes': userid },
                },

            );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-10 08:07:11

没有一种直接的方法可以同时执行提取或推送单个查询的操作,

有两种方法,

1)使用两个查询查找和更新:

  • 使用arrayFilters更新嵌套数组元素
  • $push插入元素
  • $pull移除元素
代码语言:javascript
代码运行次数:0
运行
复制
var post = await collection('post').findOne({
  posted: postId,
  ommentsOnPost: {
    $elemMatch: {
      commentId: commentId,
      repliesOnPost: {
        $elemMatch: {
          replyId: replyId
          likesOnReply: userid
        }
      }
    }
  }
});

var updateOperator = "$push";
// FOUND USER ID THEN DO REMOVE OPERATION
if (post) updateOperator = "$pull";

// QUERY
await collection('post').updateOne(
  { postId: postId },
  {
    [updateOperator]: {
      "commentsOnPost.$[c].repliesOnPost.$[r].likesOnReply": userid
    }
  },
  {
    arrayFilters: [
      { "c.commentId": commentId },
      { "r.replyId": replyId }
    ]
  }
)

游乐场

2) 使用聚合管道进行更新 从MongoDB 4.2:开始

  • $map来迭代commentsOnPost数组的循环,检查commentId是否匹配,然后转到下一个进程,否则返回现有对象
  • $mergeObjects将当前对象与更新字段合并
  • $map来迭代repliesOnPost数组的循环并检查replyId是否匹配,然后转到下一个进程,否则返回一个现有的对象。
  • 检查likesOnReplyuserid的条件,然后使用$filter执行删除,否则使用$concatArrays插入
代码语言:javascript
代码运行次数:0
运行
复制
await collection('post').findOneAndUpdate(
  { postId: "232323" },
  [{
    $set: {
      commentsOnPost: {
        $map: {
          input: "$commentsOnPost",
          in: {
            $cond: [
              { $eq: ["$$this.commentId", commentId] },
              {
                $mergeObjects: [
                  "$$this",
                  {
                    repliesOnPost: {
                      $map: {
                        input: "$$this.repliesOnPost",
                        in: {
                          $cond: [
                            { $eq: ["$$this.replyId", replyId] },
                            {
                              $mergeObjects: [
                                "$$this",
                                {
                                  likesOnReply: {
                                    $cond: [
                                      { $in: [userid, "$$this.likesOnReply"] },
                                      {
                                        $filter: {
                                          input: "$$this.likesOnReply",
                                          cond: { $ne: ["$$this", userid] }
                                        }
                                      },
                                      {
                                        $concatArrays: ["$$this.likesOnReply", [userid]]
                                      }
                                    ]
                                  }
                                }
                              ]
                            },
                            "$$this"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              "$$this"
            ]
          }
        }
      }
    }
  }]
)

玩偶犬

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68325056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档