【问题标题】:Creating a filter in mongo-go-driver for .FindOne在 .FindOne 的 mongo-go-driver 中创建过滤器
【发布时间】:2019-07-02 17:09:37
【问题描述】:

我正在尝试检查一个集合,看看是否至少有一个文档与一组特定的值匹配。

我已尝试阅读https://github.com/mongodb/mongo-go-driver#usage 的文档,但我似乎无法在那里找到太多帮助。我对 MongoDB & Go 很陌生,我相信这更多是我缺乏经验的问题。

这是我尝试使用 mongo-go-driver 运行的来自 Studio 3T 的示例查询:

db.getCollection("events").find(
    { 
        "event.eventType" : "OSR", 
        "context.vehicleId" : NumberInt(919514), 
        "ts" : {
            "$gte" : ISODate("2019-06-21T21:38:43.022+0000")
        }
    }
).limit(1);

似乎context.FindOne 方法可以满足我的要求(并且不再需要.limit(1))。我认为直接将其“移植”到 Go 和 mongo-go-driver。

我可以完成这项工作,例如,我有以下内容可以找到所有 OSR:

var query = &bson.D{
        {"event.eventType", "OSR"},
    }

result := bson.D{}
e := collection.FindOne(context.TODO(), query).Decode(&result)

这将返回给我一份文件。现在,如果我想包含 vehicleId 值,我将 query 更新为:

var query = &bson.D{
        {"event.eventType", "OSR"},
        {"context.vehicleId", 919514}, 
    }

没有文件被退回。我还没有费心扩展query 以包含ts 字段。

我希望 at 仍然至少返回一个文档,但没有显示任何内容。是否有人对我做错了什么(或者我可以如何做得更好)有一些提示、建议或指导?

【问题讨论】:

  • 你的代码有效,你确定你在正确的数据库和集合上

标签: mongodb go


【解决方案1】:

不太确定,但您是否尝试过使用bson.M 而不是bson.D

它似乎至少对我有用。

query := &bson.M{
  "event.eventType": "OSR",
  "context.vehicleId": 919514, 
}

更多信息请参考docs

另外,就像@owlwalks 所说,你确定你的收藏是对的吗?

【讨论】:

  • 感谢您的反馈。我会尝试bson.M,希望能解决问题。我仔细检查了一遍,我 100% 确定我在正确的收藏中(感谢@owlwalks 的建议)。
  • 太棒了!告诉我进展如何,@TomOpgenorth
  • 使用bson.M 有效。我们还发现我的查询没有使用正确的索引,这导致它的效率非常低,而且速度非常慢。
  • 来自文档,bson.D 仅在需要文档中元素的顺序时才应使用。 github.com/mongodb/mongo-go-driver/blob/…
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 2021-11-14
  • 2019-04-06
  • 1970-01-01
  • 2019-10-17
  • 2019-07-13
相关资源
最近更新 更多