微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用本机驱动程序附加到 mongo 查询

如何解决使用本机驱动程序附加到 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.Dbson.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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?