首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongoose:如果对象数组中存在值,则筛选数据。

Mongoose:如果对象数组中存在值,则筛选数据。
EN

Stack Overflow用户
提问于 2020-07-30 07:39:42
回答 2查看 2.6K关注 0票数 3

我有一个使用聚合的工作猫鼬查询,其中我根据对象数组中的值过滤数据,并且由于需求的变化而陷入麻烦。

这就是我的数据在MongoDB中的样子(它已经填充了虚拟数据)

代码语言:javascript
运行
复制
{
"_id" : ObjectId("5ef44528af5a1a2a641cd52b"),
"active" : true,
"name" : "CompanyA",
"contacts" : [ 
    {
        "secondary_emails" : [],
        "_id" : ObjectId("5f19727495f4da29403923e3"),
        "email" : "contact@gmail.com",
        "designation" : "VP Cloud & Security",
        "address" : "",
        "name" : "Ron"
    }
],
"services" : [ 
    {
        "active" : true,
        "_id" : ObjectId("5ef44528af5a1a2a641cd52d"),
        "name" : "Company Management",
        "title" : "Company Helpline",
        "description" : "Offering voice, meetings, collaboration and contact center all on one cloud platform.",
        "categories" : [ 
            "SD-WAN", 
            "Security and Compliance"
        ],
        "sub_categories" : [ 
            "Solution"
        ],
    },
    {
      "active" : true,
      "_id" : ObjectId("5ef44528af5a1a2a641cd52c"),
      "name" : "Company HR",
      "title" : "Human Resources",
      "description" : "Offering HR Services to all",
      "categories" : [ 
          "HR", "Company"
      ],
      "sub_categories" : [ 
          "Solution"
      ],
  }
]}

目标:筛选服务基于用户提供的类别(假设它的"SD-WAN"),在类别是单数之前,现在它是一个值数组,因为一个服务可以属于多个类别。

以前的解决方案我的猫鼬查询(用于单数类别值)如下所示:

代码语言:javascript
运行
复制
db.Collection("suppliers").aggregate([
  {
    $project: {
      services: {
        $filter: {
          input: "$services",
          as: "services",
          cond: { $eq: ["$$services.category", "SD-WAN" ] },
        },
      },
    },
  },
  { $match: { services: { $exists: true, $not: { $size: 0 } } } },
]);

我很难在SD-WAN中搜索$$services.categories,这是一个值数组。是否有任何方法更新上述查询,以便使用services.categories管道操作符或其他解决方案在$eq数组中搜索值。

预期结果

代码语言:javascript
运行
复制
"_id" : ObjectId("5ef44528af5a1a2a641cd52b"),
"services" : [ 
    {
        "active" : true,
        "_id" : ObjectId("5ef44528af5a1a2a641cd52d"),
        "name" : "Company Management",
        "title" : "Company Helpline",
        "description" : "Offering voice, meetings, collaboration and contact center all on one cloud platform.",
        "categories" : [ 
            "SD-WAN", 
            "Security and Compliance"
        ],
        "sub_categories" : [ 
            "Solution"
        ],
    }
]

如果有人能帮我解决这个问题,我会很感激的。如果需要更多的信息,请询问。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-30 08:01:03

这就是你要找的。

代码语言:javascript
运行
复制
[
  {
    $unwind: "$services"
  },
  {
    $match: {
      "services.categories": "SD-WAN"
    }
  },
  {
    $group: {
      _id: "$_id",
      active: {
        $first: "$active"
      },
      name: {
        $first: "$name"
      },
      contacts: {
        $first: "$contacts"
      },
      services: {
        $addToSet: "$services"
      }
    }
  }
]
  1. 使用$unwind将数组扁平化
  2. 使用$match进行过滤
  3. 使用$group对其进行分组。

我们只对服务进行扁平处理。这就是我使用$addToSet的原因

工作蒙戈游乐场

票数 1
EN

Stack Overflow用户

发布于 2020-07-30 08:20:46

以下是另一种不使用聚合游乐场链接的方法:https://mongoplayground.net/p/jmLghGBXb7f

代码语言:javascript
运行
复制
db.collection.find({
  "services": {
    $elemMatch: {
      categories: {
        $regex: "SD-WAN",
        $options: "i"
      }
    }
  }
},
{
  "services": {
    $elemMatch: {
      categories: {
        $regex: "SD-WAN",
        $options: "i"
      }
    }
  }
})

产出:

代码语言:javascript
运行
复制
[
  {
    "_id": ObjectId("5ef44528af5a1a2a641cd52b"),
    "services": [
      {
        "_id": ObjectId("5ef44528af5a1a2a641cd52d"),
        "active": true,
        "categories": [
          "SD-WAN",
          "Security and Compliance"
        ],
        "description": "Offering voice, meetings, collaboration and contact center all on one cloud platform.",
        "name": "Company Management",
        "sub_categories": [
          "Solution"
        ],
        "title": "Company Helpline"
      }
    ]
  }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63168397

复制
相关文章

相似问题

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