【问题标题】:Proper wildcard multi field query with the official mongo-go-driver使用官方 mongo-go-driver 进行正确的通配符多字段查询
【发布时间】:2019-10-12 23:35:36
【问题描述】:

我有一个数据库字段:

            "sessionid": "C-dhf",
            "given": "NURSE ",
            "family": "SHARK",
            "name": "SHARK, NURSE",

我正在尝试创建一个查询,该查询将查询数据库以查找家族以“s”开头的记录,给定名称以“n”开头。我正在使用以下内容来创建过滤器。

        {"sessionid", "C-dhf"},
        {"$and", bson.A{
            bson.D{{"family", primitive.Regex{Pattern: "^s", Options: "i"}}},
            bson.D{{"given", primitive.Regex{Pattern: "^n", Options: "i"}}},
        }},
    }

查找中使用的过滤器值为:

[{sessionid C-dhf} {$and [[{family {"pattern": "^s", "options": "i"}}] [{given {"pattern": "^n", "options": "i"}}]]}]

发现是:

cursor, err := collection.Find(context.TODO(), filter, findOptions)

它返回数据库中的所有记录,就好像它甚至没有查看过滤器一样。

多字段通配符查询的正确 go 语法是什么?

【问题讨论】:

    标签: mongodb go mongodb-query mongo-go


    【解决方案1】:

    默认情况下,所有列出的条件都是逻辑与连接 ($and),因此您无需添加:

    filter := bson.D{
        {"sessionid", "C-dhf"},
        {"family", primitive.Regex{Pattern: "^s", Options: "i"}},
        {"given", primitive.Regex{Pattern: "^n", Options: "i"}},
    }
    

    如果您想要逻辑 OR 连接,您使用的语法和结构将是合适的:如果您想要具有给定会话 ID 并且其姓氏以 s 或给定名称以 n 开头的文档。可能是这样的:

    filter := bson.D{
        {"sessionid", "C-dhf"},
        {"$or", bson.A{
            bson.D{{"family", primitive.Regex{Pattern: "^s", Options: "i"}}},
            bson.D{{"given", primitive.Regex{Pattern: "^n", Options: "i"}}},
        }},
    }
    

    【讨论】:

    • 你的例子说或者你的描述是一个和,特别是我想要的。我需要将这三个都包含在返回的集合中。请澄清
    • @DonaldFrench 我的第一个例子没有说 OR,这就是我认为你想要的问题。请您澄清您想要哪个问题,但我在回答中同时提出了(AND 和 OR)。
    • 好的,我想要 AND。我误解了你的最后一句话。了解这两种格式是件好事。
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2019-05-21
    • 2020-05-01
    相关资源
    最近更新 更多