Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中

Posted

技术标签:

【中文标题】Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中【英文标题】:Mongoose- Search/Filter data from array into another array with the specific items 【发布时间】:2021-09-11 15:23:14 【问题描述】:

我有一个类似的 mongoDB 对象

   
    "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

另外一次我必须使用courseName usertopics 进行查询 其中至少匹配一个主题的主题。我该如何处理这个过程?

当我以courseNameuser 和主题["b"] 传递输入时。我在返回输出中取消选择 useroptionsSet。我的预期输出将是:


    "courseName" : "AI",
    "questions" : [ 
        
            "topics" : ["b", "c", "a"],
        , 
        
            "topics" : ["b"],
        
    ]

这可能吗?

【问题讨论】:

你可以使用点符号 "questions.topics": "a" 我的输入将是数组。像 ["a", "b"] 可以使用$in操作符 "questions.topics": "$in": ["a", "b"] 我更新了我的问题,turivishal 【参考方案1】:

可以使用聚合查询,

$match 使用 $in 运算符检查您的状况 $filter 迭代 questions 的循环并检查主题是否有任何输入搜索 topics $filter 迭代 topics 的循环并搜索 topics
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();

Playground

【讨论】:

我可以不使用聚合框架进行查询吗?我还必须匹配其他字段。我更新了我的问题。请不要介意 turrivishal。 我已经用猫鼬聚合管道生成器更新了答案。 你使用YourSchema是数据库模型还是只是模式?我得到一个空数组作为输出。 它的猫鼬数据库模式模型。 你能再帮忙吗?我使用了我想在正常聚合中检索/选择的元素。但是这样我不想选择用户作为返回对象。我该怎么做?

以上是关于Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中的主要内容,如果未能解决你的问题,请参考以下文章

具有 .every() 等效项的 Mongoose 聚合

Mongoose:如果值存在于对象数组中的数组中,则过滤数据

过滤和更新 mongodb mongoose 中的嵌入式数组

Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

查询子文档并从中选择过滤后的数据 Mongoose

使用 graphql-compose-mongoose 将对象添加到 mongodb 模型中的对象数组