如何解决使用本机驱动程序附加到 mongo 查询
type SearchReq struct {
PageSize int32
Offset int32
Zipcode string
PracticeType []string
TreatmentType []string
HasPhotos bool
LatLong GeoLocationInput
}
func buildSearchQuery(searchOptions *database.SearchReq) bson.D {
var filter bson.D
if searchOptions.Zipcode != "" {
filter = append(filter,bson.E{"zipcode",searchOptions.Zipcode})
}
if len(searchOptions.PracticeType) != 0 {
filter = append(filter,bson.E{"practicetypes",bson.E{"$all",searchOptions.PracticeType}})
}
if len(searchOptions.TreatmentType) != 0 {
filter = append(filter,bson.E{"treatments",searchOptions.TreatmentType}})
}
if searchOptions.HasPhotos {
filter = append(filter,bson.E{"avatarurl",bson.E{"$ne",nil}})
}
return filter
}
我尝试进行的查询之一如下所示:
db.providers.find({treatments: {$all: ["botox","not-botox"]},zipcode: "90210"})
过滤器打印出来:
1st run: [{zipcode 60010} {avatarurl {$ne <nil>}}]
2nd run: [{zipcode 90210} {treatments {$all [botox not-botox]}}]
该命令行查询会提取结果,而 to Go 变体则不会。我尝试将其切换到地图,但无济于事。我在这里做错了什么?
理想情况下,我正在尝试构建一种向一个查询添加一组条件的方法。
附注。来自命令行查询的记录
{ "_id" : ObjectId("6001d1aab756f9540e8850ba"),"name" : "Mr. Brandy emmerich","accountnumber" : "b0c6ee03ab","displayname" : "Mr. Brandy emmerich","streetaddress" : "92813 Funk Isle","city" : "New Artville","statename" : "Oklahoma","zipcode" : "90210","websiteurl" : "http://wildermannikolaus.org/robert.wolf","emailaddress" : "hosea.runte@example.com","telephonenumber" : "","hours" : [ { "day" : 0,"open" : ISODate("2021-01-15T17:32:26.383Z"),"close" : ISODate("2021-01-15T17:32:26.383Z") },{ "day" : 1,{ "day" : 2,{ "day" : 3,{ "day" : 4,{ "day" : 5,{ "day" : 6,"close" : ISODate("2021-01-15T17:32:26.383Z") } ],"instagramurl" : "https://instagram.com/ilene.kunde","twitterurl" : "https://twitter.com/ilene.kunde","facebookurl" : "https://facebook.com/ilene.kunde","avatarurl" : "http://wehner.name/nick","treatments" : [ "botox","not-botox" ],"practicetypes" : null,"tags" : [ "","","id","delectus","pariatur" ],"Metadata" : { "dolorem" : "excepturi","numquam" : "at" },"created_at" : ISODate("2021-01-15T17:32:26.383Z") }
{ "_id" : ObjectId("6001d1d0701489602c55f82a"),"name" : "Clara McLaughlin","accountnumber" : "964a3de178","displayname" : "Clara McLaughlin","streetaddress" : "8708 Rodolfo Prairie","city" : "Parisianburgh","statename" : "West Virginia","websiteurl" : "http://pollich.org/kimberly_rau","emailaddress" : "emiliano@example.org","open" : ISODate("2021-01-15T17:33:04.526Z"),"close" : ISODate("2021-01-15T17:33:04.526Z") },"close" : ISODate("2021-01-15T17:33:04.526Z") } ],"instagramurl" : "https://instagram.com/presley","twitterurl" : "https://twitter.com/presley","facebookurl" : "https://facebook.com/presley","avatarurl" : "http://baumbach.com/minerva","corporis","eveniet","velit" ],"Metadata" : { "enim" : "nisi" },"created_at" : ISODate("2021-01-15T17:33:04.526Z") }
解决方法
问题在于您如何添加复合过滤器。如果它们不是单个值,例如如果您使用的是 $all
或 $ne
,则必须使用“完整”文档作为它们的值。 bson.E
不是“完整”文档,它只是文档的元素。完整的文档是 bson.D
或 bson.M
。
因此将其用作您的过滤器构建器:
func buildSearchQuery(searchOptions *database.SearchReq) bson.D {
var filter bson.D
if searchOptions.Zipcode != "" {
filter = append(filter,bson.E{"zipcode",searchOptions.Zipcode})
}
if len(searchOptions.PracticeType) != 0 {
filter = append(filter,bson.E{"practicetypes",bson.D{{"$all",searchOptions.PracticeType}}})
}
if len(searchOptions.TreatmentType) != 0 {
filter = append(filter,bson.E{"treatments",searchOptions.TreatmentType}}})
}
if searchOptions.HasPhotos {
filter = append(filter,bson.E{"avatarurl",bson.D{{"$ne",nil}}})
}
return filter
}
另请注意,如果 searchOptions
为空,则上面将返回 nil
,作为过滤器无效。确保它已初始化为非 nil
空切片。所以代替
var filter bson.D
使用
filter := bson.D{}
另请注意,使用 bson.M
而不是 bson.D
更简单:
func buildSearchQueryMap(searchOptions *database.SearchReq) bson.M {
filter := bson.M{}
if searchOptions.Zipcode != "" {
filter["zipcode"] = searchOptions.Zipcode
}
if len(searchOptions.PracticeType) != 0 {
filter["practicetypes"] = bson.M{"$all": searchOptions.PracticeType}
}
if len(searchOptions.TreatmentType) != 0 {
filter["treatments"] = bson.M{"$all": searchOptions.TreatmentType}
}
if searchOptions.HasPhotos {
filter["avatarurl"] = bson.M{"$ne": nil}
}
return filter
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。