如何从mongodb获取唯一记录?

如何从mongodb获取唯一记录?,mongodb,go,mongodb-query,mgo,Mongodb,Go,Mongodb Query,Mgo,我有一个名为“myplace”的收藏。它有以下字段:地名、纬度、经度、城市、国家 我想要所有以字母“A”开头的城市。我尝试了以下方法: type Place struct{ City string `bson: "City"` } 要从数据库检索结果,请执行以下操作: var city_name []Place err = coll.Find(bson.M{"city": bson.M{"$regex":"^a", "$options":"si"}}).All(&city_na

我有一个名为“myplace”的收藏。它有以下字段:地名、纬度、经度、城市、国家

我想要所有以字母“A”开头的城市。我尝试了以下方法:

type Place struct{
    City string `bson: "City"`
}
要从数据库检索结果,请执行以下操作:

var city_name []Place
err = coll.Find(bson.M{"city": bson.M{"$regex":"^a", "$options":"si"}}).All(&city_name)
它得到了所有的结果。问题是一些“myplace”文档具有相同的城市,因此它返回重复的城市名称

假设我有5个地方,3个城市名为“巴吞鲁日”,剩下的是“高知特里凡得鲁姆”。当我试图让城市以“B”开头时,它会返回“巴吞鲁日”三次

如何确保每个城市的名称是唯一的

提前感谢

您可以:


…这假设
city\u name
实际上是一个切片。

您可以使用Distinct方法,在shell中它看起来像:

db.foo.distinct( "city",  { "city" : { "$regex" : /^A/i    } }  );
围棋:

 var result []string 

 err = c.Find( bson.M{"city": bson.M{"$regex":"^a","$options":"si"}}  ).Distinct("city", &result) 

 if err != nil {
        log.Fatal(err) 
 }

 fmt.Println( result )

然后呢?很明显,在指定的条件下,“城市名称”在您的数据中是重复的。您打算如何处理文档中的其他字段?你想要第一个吗?你想要最后一个吗?你想要一些“最小/最大”值的东西吗?如果你想真正回答你的问题,你需要问一个更好的问题,说明你真正打算做什么。@NeilLunn让我说我有5个位置,在这3个位置上,城市名为巴吞鲁日,剩下的是Trivandrum,Kochi,像这样。现在我试图得到的城市,其中有开始字母“B”,其返回3倍的“巴吞鲁日”,它仍然基本上有点广泛。执行类似“^B”的正则表达式查询将返回以“B”开头的任何内容。您总是可以将其分解为字段的“不同”值(有功能),但我所说的是,这可能掩盖了目的。“巴吞鲁格”可能在其他地方有“zipcode”字段,而你没有说出你真正打算做什么。“独特”是一个与你的意图相关的术语。我要求你“陈述你的意图”。这是基本数据原则,不是MongoDB特有的。很抱歉,它返回了空数组。请更新您的问题,以包括您尝试过的内容-还包括更多详细信息,如您的文档结构和城市名称声明。当你这样做的时候,我会删除我的答案(所以我知道你已经更新了)。PS:这在我的测试中有效。当我在测试集合中手动抛出
db.cities.distinct(“name”、{name:{“$regex”:“^[^a]“}}}”)时,它也可以工作。我像这样使用Place struct{City string
bson:“City”
}var result[]Place err=c.Find(bson.M{“City”:bson.M{“$regex”:“^a”、“$options:“si”})。distinct(“City”,&result)如果错误!=nil{log.Fatal(err)}fmt.Println(result)返回为空distinct运算符将选择属性“city”的每个值,因此结果是city字段类型的数组,而不是位置数组。您需要确保使用的是var result[]字符串
 var result []string 

 err = c.Find( bson.M{"city": bson.M{"$regex":"^a","$options":"si"}}  ).Distinct("city", &result) 

 if err != nil {
        log.Fatal(err) 
 }

 fmt.Println( result )