Mongodb Mongo-将对象的特定字段区分为数组

Mongodb Mongo-将对象的特定字段区分为数组,mongodb,distinct-values,Mongodb,Distinct Values,我的目标是获得第一个数组元素的第四个字段的“distinct” 我的样本数据: { 'name': 'tizio' ,'address':[{ 'roadType' : "via", , 'roadname' : "Roma" , 'number' : "12 bis" , 'city' : 'Milano'

我的目标是获得第一个数组元素的第四个字段的“distinct”

我的样本数据:

{
 '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的想法

选择distinct(地址[0][4])。键作为社区类型,
不同的(地址[0][4])。值作为社区名称
从集合


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接受该查询

mongoplayground将不允许您运行
distinct
,只允许
find
aggregate

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

您可以使用聚合将对象转换为数组,提取第n个字段,然后在该字段上分组。还要注意,数组索引是基于0的,因此这些对象中没有一个具有索引4的元素

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

Mongoplayground将不允许您运行
distinct
,只允许
查找
聚合

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

您可以使用聚合将对象转换为数组,提取第n个字段,然后在该字段上分组。还要注意,数组索引是基于0的,因此这些对象中没有一个具有索引4的元素

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