MongoDB - 获取具有不同的数组
Posted
技术标签:
【中文标题】MongoDB - 获取具有不同的数组【英文标题】:MongoDB - Get arrays with distinct 【发布时间】:2022-01-03 03:33:03 【问题描述】:我正在尝试在我的数据中获取“坐标”类型的所有值(数组),如下所示:
[
["51.50064317423898","-0.09372711181640626"],
["51.48465408363687","-0.13149261474609378"]
]
我试过 db.collections("mydb").distinct("coordinate") 但我得到了:
[
'-0.09372711181640626',
'-0.13149261474609378',
'51.48465408363687',
'51.50064317423898'
]
有没有人知道我怎样才能拥有我想要的所有数组而不是在一个数组中排序? “mydb”看起来像这样:
"name":"dfbfdbf",
"coordinate":["51.50064317423898","-0.09372711181640626"],
"rating":"8",
"description":"geojzglijsen"
,
"name":"qzfgs",
"coordinate":["51.48465408363687","-0.13149261474609378"],
"rating":"5",
"description":"femkndsmnk"
谢谢!
【问题讨论】:
【参考方案1】:如果您需要从您的收藏中获取不同的坐标:
mongos> db.a.find()
"_id" : ObjectId("619ea12e032deead586f3f91"), "name" : "dfbfdbf", "coordinate" : [ "51.50064317423898", "-0.09372711181640626" ]
"_id" : ObjectId("619ea138032deead586f3f92"), "name" : "a", "coordinate" : [ "51.50064317423898", "-0.09372711181640626" ]
"_id" : ObjectId("619ea14c032deead586f3f93"), "name" : "a", "coordinate" : [ "51.50064317423898", "-0.19372711181640626" ]
"_id" : ObjectId("619ea157032deead586f3f94"), "name" : "a", "coordinate" : [ "51.50064317423898", "-0.09372711181640626" ]
"_id" : ObjectId("619ea15b032deead586f3f95"), "name" : "a", "coordinate" : [ "52.50064317423898", "-0.09372711181640626" ]
"_id" : ObjectId("619ea160032deead586f3f96"), "name" : "a", "coordinate" : [ "52.50064317423898", "-0.09372711181640626" ]
mongos> db.a.aggregate([
$addFields:coordinates:$reduce: input: $slice:["$coordinate",1,$size:"$coordinate" ],initialValue:$arrayElemAt:["$coordinate",0],in:$concat:["$$value",";","$$this" ] ,
$group:_id:"$coordinates" , cnt:$sum:1 ,
$project : coordinate : $split: ["$_id", ";"] ,_id:0
])
"coordinate" : [ "51.50064317423898", "-0.19372711181640626" ]
"coordinate" : [ "51.50064317423898", "-0.09372711181640626" ]
"coordinate" : [ "52.50064317423898", "-0.09372711181640626" ]
mongos>
示例: here
解释: 从集合中删除重复的坐标
-
创建新的字段坐标,将坐标连接到单个字符串中
对坐标进行分组以删除重复项
将坐标拆分为原始值。
此解决方案也没有 16MB 的不同坐标数组摘要大小的限制...
【讨论】:
【参考方案2】:如果我理解正确,你可以试试这个聚合查询:
重点是$group
by null
获取所有值并使用$addToSet
防止重复值。
db.collection.aggregate([
"$group":
"_id": null,
"coordinate":
"$addToSet": "$coordinate"
,
"$project":
"_id": 0
])
示例here 我复制了一个对象以查看重复值如何不显示。
【讨论】:
以上是关于MongoDB - 获取具有不同的数组的主要内容,如果未能解决你的问题,请参考以下文章