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 - 获取具有不同的数组的主要内容,如果未能解决你的问题,请参考以下文章

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

MongoDB $查找具有不同值的对象数组

MongoDB:获取具有两个值的不同组合的最新文档

mongodb在子文档数组的数组中获取不同的项目

Mongodb的副本集节点角色介绍及选举过程浅析

使用 C# 代码从 MongoDB 数组中获取不同的值,其中它专门匹配某些值