首页 > 解决方案 > MongoDB 根据条件返回不同的值

问题描述

我正在尝试使用 MongoDbdetails.sub_ap_name在搜索details.ap_name等于时返回不同的值,EVPN但是我的搜索返回的所有唯一值details.sub_ap_name

这是我当前查询的样子。我也尝试了一些聚合搜索,但这些也不适用于我。有人可以让我知道我可能做错了什么吗?

db['test-data'].distinct("details.sub_ap_name",{"details.ap_name": "EVPN"})

这是我的数据集

{ 
    "_id" : ObjectId("101"), 
    "details" : [
        {
            "run_date" : "2021-04-18",
            "ap_name" : "EVPN",
            "sub_ap_name" : "EVPN TOR"
            
           
        },
        {
              "run_date" : "2021-04-18",
              "ap_name" : "EVPN",
              "sub_ap_name" : "EVPN Mobility"
             
             
        },
        {
            "run_date" : "2021-04-17",
            "ap_name" : "Multicast",
            "sub_ap_name" : "Multicast Layer 2"

        }
    ]
}

标签: mongodbmongodb-queryaggregation-frameworkpymongo

解决方案


演示 - https://mongoplayground.net/p/49vHHUNYn8K

details.ap_name注意-为性能添加索引

$放松

从输入文档中解构一个数组字段以输出每个元素的文档。每个输出文档都是输入文档,其中数组字段的值被元素替换。

$addToSet

返回一个由所有唯一值组成的数组,这些唯一值是通过将表达式应用于一组文档中的每个文档而产生的,这些文档按键共享同一组。未指定输出数组中元素的顺序。

$组

按指定的 _id 表达式对输入文档进行分组,并为每个不同的分组输出一个文档。每个输出文档的 _id 字段包含唯一的按值分组。输出文档还可以包含计算字段,这些字段包含一些累加器表达式的值。

db.collection.aggregate([
  { $match: { "details.ap_name": "EVPN" } }, // filter to reduce load on unwind
  { $unwind: "$details" }, // break into individual documents
  { $match: { "details.ap_name": "EVPN" } }, // filter
  {
    $group: { _id: "$details.ap_name", "sub_ap_names": { $addToSet: "$details.sub_ap_name" } } // add unique values
  }
])

推荐阅读