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