带有go动态的mongodb查询

Posted

技术标签:

【中文标题】带有go动态的mongodb查询【英文标题】:mongodb query with go dynamic 【发布时间】:2021-01-19 03:17:53 【问题描述】:

我想构建一个动态的 mongo 查询,但在 google 中搜索,我不明白为什么第一个查询返回 null。

matches := []bson.Mbson.M"$match": bson.M"age": bson.M"$gt": 20
err2 := coll.Find(matches).All(&persons)

这显示了预期的行:

err2 = coll.Find(bson.M"age": bson.M"$gt": 20).All(&persons)

您能否举一个简单的例子,如何使用两个参数构建查询?

谢谢。

【问题讨论】:

Find() 需要一个过滤器 document ,在您的第一个示例中,您传递了一段文档。它与动态无关。单个文档可能包含多个过滤器,例如bson.M"age": bson.M"$gt": 20, "name": "Bob"。你有什么问题? 问题是为什么匹配 := []bson.Mbson.M"$match": bson.M"age": bson.M"$gt": 20 不管用。以及如何动态连接多个过滤器。 【参考方案1】:

您的第一个示例不起作用,因为 Collection.Find() 需要一个单个过滤器文档,而您将一个文档片段传递给它。

单个文档可能包含多个过滤器,例如bson.M"age": bson.M"$gt": 20, "name": "Bob",所以实际上这不会构成限制。

如果您有多个过滤器文档并且想要应用所有过滤器文档,则必须将它们“合并”到单个文档中。

一般的解决方案是创建一个带有 $and 键的文档(如果您希望它们处于逻辑 AND 连接,或者 $or 如果您希望逻辑 OR),其在映射中的值是过滤器切片(文档)。

这就是这么简单:

// filters contains all the filters you want to apply:
filters := []bson.M
    bson.M"age": bson.M"$gt": 20,
    bson.M"name": "Bob",


// filter is a single filter document that merges all filters
filter := bson.M"$and": filters

// And then:
err := coll.Find(filter).All(&persons)

【讨论】:

以上是关于带有go动态的mongodb查询的主要内容,如果未能解决你的问题,请参考以下文章

Go + MongoDB:多态查询

带有条件的MongoDB聚合查询

带有日期时间的 MongoDB / Pymongo 查询

mongoDB,带有 $sum 和 $count 的 mongoose 聚合查询

mongoDB,带有 $sum 和 $count 的 mongoose 聚合查询

带有 elemMatch 的 MongoDB 查询,用于从对象内部匹配嵌套数组数据 [重复]