【问题标题】:Mongo - distinct of specific field of an object into an arrayMongo - 将对象的特定字段区分为数组
【发布时间】:2020-10-16 20:43:32
【问题描述】:

我的目标是让第一个数组元素的第四个字段“与众不同”

我的样本数据:

{
 'name': 'tizio'
,'address':[{  'roadType'   : "via",
             , 'roadname'   : "Roma"
             , 'number'     : "12 bis"
             , 'city'       : 'Milano'
            },
            {  'roadType'   : "via",
             , 'roadname'   : "Emilia"
             , 'number'     : "124"
             , 'city'       : "Modena"
            },
            {  'roadType'   : "via",
             , 'roadname'   : "Appia"
             , 'number'     : "89"
             , 'city'       : "Genova"
            }
            ]
}

,{
 'name': 'caio'
,'address':[{  'roadType'   : "vicolo",
             , 'roadname'   : "stretto"
             , 'number'     : "12"
             , 'town'       : 'Monza'
            },
            {  'roadType'   : "largo",
             , 'roadname'   : "Garibaldi"
             , 'number'     : "24"
             , 'city'       : "Modena"
            },
            {  'roadType'   : "piazza",
             , 'roadname'   : "Armi"
             , 'number'     : "26"
             , 'city'       : "Rovigo"
            }
            ]
},
{
 'name': 'sempronio'
,'address':[{  'roadType'   : "via",
             , 'roadname'   : "Roma"
             , 'number'     : "15"
             , 'city'       : 'Milano'
            },
            {  'roadType'   : "via",
             , 'roadname'   : "Po"
             , 'number'     : "4"
             , 'city'       : "Torino"
            },
            {  'roadType'   : "largo",
             , 'roadname'   : "Garibaldi"
             , 'number'     : "9"
             , 'community'  : "Genova"
            }
            ]
}

在我的情况下,结果应该是:

{'city': 'Milano'}
{'town': 'Monza'}

这是一个类似sql的想法

select distinct(address[0][4]).key as community_type, 
       distinct(address[0][4]).value as community_name
from collection

在做


db.collection.distinct('address.0')

但它会返回所有字段

            {  'roadType'   : "via",
             , 'roadname'   : "Roma"
             , 'number'     : "15"
             , 'city'       : 'Milano'
            },
            {  'roadType'   : "vicolo",
             , 'roadname'   : "stretto"
             , 'number'     : "12"
             , 'town'       : 'Monza'
            },{  'roadType' : "via",
             , 'roadname'   : "Roma"
             , 'number'     : "12 bis"
             , 'city'       : 'Milano'
            }


db.collection.distinct('address.0.4')

返回一个空数组

注意:mongoplayground 说查询不正确,但 robomongo 接受它

【问题讨论】:

    标签: mongodb distinct-values


    【解决方案1】:

    Mongoplayground 不允许你运行 distinct,只有 findaggregate

    你通常不能像这样通过索引查询对象,因为对象中的字段顺序并不总是定义的,而且 MongoDB 的查询语言不支持这种用法。

    您可以使用聚合将对象转换为数组,提取第 n 个字段,然后对该字段进行分组。另请注意,数组索引是从 0 开始的,因此这些对象都不会有索引为 4 的元素。

    db.collection.aggregate([
      {$project: {
        selected: {
          $arrayElemAt: [
            {
              $objectToArray: {
                $arrayElemAt: ["$address",0]
              }
            },
            3
          ]
        }
      }},
      {$group: {_id: "$selected"}}
    ])
    

    Playground

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 2022-01-17
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2015-12-26
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多