首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬-搜索/过滤数据从数组到另一个数组与特定的项目

猫鼬-搜索/过滤数据从数组到另一个数组与特定的项目
EN

Stack Overflow用户
提问于 2021-06-29 12:00:33
回答 1查看 405关注 0票数 2

我有一个mongoDB对象,类似于

代码语言:javascript
复制
{   
    "courseName" : "AI",
    "user" : ObjectId("6087dc4c2ba7a828363c9fca"),
    "questions" : [ 
        { 
             "optionsSet" : [ 
                {
                    "value" : "A",
                },
                {
                    "value" : "B",
                }
             ],
            "topics" : ["b", "c", "a"],
            "createdAt" : "2021-07-07T18:41:18.971Z"
        }, 
        {
           "optionsSet" : [ 
                {
                    "value" : "C",
                },
                {
                    "value" : "D",
                }
             ],
            "topics" : ["c"],
            "createdAt" : "2021-08-07T18:41:18.971Z
        },
        {
            "optionsSet" : [ 
                {
                    "value" : "CC",
                },
                {
                    "value" : "DD",
                }
             ],
            "topics" : ["b"],
            "createdAt" : "2021-08-07T18:41:30.971Z"
        }
    ]
}

有时,我只能使用匹配的courseNameuser

另一次,我必须使用courseNameusertopics查询其中的主题,这些主题至少与一个主题匹配。我如何处理这个过程?

当我将输入作为courseNameuser和主题["b"]传递时。我取消了返回输出中的useroptionsSet。我的预期产出是:

代码语言:javascript
复制
{
    "courseName" : "AI",
    "questions" : [ 
        {
            "topics" : ["b", "c", "a"],
        }, 
        {
            "topics" : ["b"],
        }
    ]
}

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-29 13:04:36

您可以使用聚合查询,

  • $match使用$in运算符检查您的状态
  • $filter来迭代questions的循环并检查是否有任何输入搜索topics
  • $filter迭代topics循环并搜索topics
代码语言:javascript
复制
let p = YourSchema.aggregate();

// courseName
if (req.body.courseName) p.match({ courseName: req.body.courseName });

// user
if (req.body.user) p.match({ user: req.body.user });

// topics
if (req.body.topics) {
  p.match({ "questions.topics": { $in: req.body.topics } });

  p.addFields({
    questions: {
      $filter: {
        input: "$questions",
        cond: {
          $ne: [
            {
              $filter: {
                input: "$$this.topics",
                cond: { $in: ["$$this", req.body.topics] }
              }
            },
            []
          ]
        }
      }
    }
  });
}

let result = await p.exec();

游乐场

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

https://stackoverflow.com/questions/68178311

复制
相关文章

相似问题

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