问题标签 [mgo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
627 浏览

mongodb - Windows和Linux上mgo驱动对ObjectID的不同处理

我使用 mgo 驱动程序开发 Go 代码以与 MongoDB 一起使用。首先我在 Windows 计算机上开发它,它工作得很好(在同一台 Windows 计算机上安装 Mongo DB)。然后我将源代码复制到一台装有 MongoDB 的 Linux 机器上,在那里构建它,但它不起作用。问题是它如何从数据库中读取对象“_id”。

在 Windows 上,它是普通的 12 字节 ObjectId,类似于此(使用 bson.ObjectId.String() 显示):

但在 Linux 上是这样的:

当然,我不能将该对象 ID 用于引用等。它有 17 个字节长。

一件有趣的事情是,在 Windows 上,MongoDB shell 显示 ObjectId 如下:

在这样的 Linux 上:

如果我以 HEX 格式逐个字符地转换字符串"3unF9zhB3vYCq9TjQ",它将完全是"33756e46397a6842337659437139546a51"。所以,我的理解是,Linux 上的 mgo 驱动程序不是对 _id 进行 base64 解码,而是将它的每个字节转换为 HEX 格式。

我想我可以弄清楚如何自己重新编码,但它是Linux上mgo驱动程序中的一个已知错误,还是我在这里遗漏了一些东西,比如一些配置等?我想保持我的程序可移植。

谢谢。

0 投票
1 回答
9288 浏览

mongodb - Go mgo 包中的连接池

running-mongodb-queries-concurrently-with-go文章中说 mgo.DialWithInfo :创建一个会话,该会话维护与 MongoDB 的套接字连接池,但是当我在函数DialWithInfo的文档中查找时,我没有找到任何东西谈论池连接,只有我在Dial Function Dial Function 中找到了一些内容:对于给定的集群,此方法通常只调用一次。然后在获得的会话上使用 New 或 Copy 方法建立到同一集群的更多会话。这将使它们共享底层集群,并适当地管理连接池。

  • 有人能告诉我 MGO 上的池连接是如何工作的吗?是否可以设置这个池?
  • DialWithInfo 创建池连接是真的还是只是创建此池的 Dial 函数?

提前致谢

0 投票
1 回答
1618 浏览

go - Golang 处理数据库连接的“最佳实践”

我有一个用 Go 编写的 web 服务,目前我有这个全局包,我在任何地方都导入了这个包,其中包含与 MongoDB 的连接(通过 MGO),但我不得不说这对我来说感觉很恶心。在 Go 中维护与数据源的连接的最佳实践是什么?我来自 PHP 世界,因此是 Global :S

0 投票
1 回答
1321 浏览

struct - MGO / GOLANG:结构解组文件

我有一个看起来像这样的 Mongo 模式:

入口文档数组如下所示:

如何在 Golang 中格式化 PhoneBook 结构,以便我可以运行这样的查询并将结果解组到 PhoneBooks 数组中?

0 投票
4 回答
962 浏览

json - 在 Go 中流式传输 BSON->JSON HTTP 回复?

目前我在 http 处理程序中运行它:

如何在完整的 BSON 数据输入之前开始提供结果?

编辑:答案需要超越mgo扩展并进入bson. mgo据我所知,如果我没记错的话,只会提供完整的文件。正如我的代码示例清楚地显示的那样,我有一个(可能很大)文档。

0 投票
1 回答
5827 浏览

go - 如何从地图中检索值-go lang?

我正在mgo与 Go 一起使用 MongoDB。我有以下代码:

Output: k: 0 v: 地图[_id:ObjectIdHex("536887c199b6d0510964c35b") transId:A000000000]

我需要_idtransId. Find我怎样才能做到这一点?

0 投票
2 回答
657 浏览

mongodb - 无法从 `[]interface{}` 断言类型 `[]string`

我正在尝试处理从mongodb ( mgo ) 检索到的一些数据。

不幸的是,我无法为字符串列表断言正确的类型。我正在处理的功能如下:

不幸的是,我在运行时出现恐慌:

知道为什么会这样吗?我怎样才能检索这些字符串?

0 投票
2 回答
17562 浏览

go - 使用 mgo 进行部分更新

我有以下问题。我需要将 a 转换为structure以便map[string]interface{}在数据库中执行更新(使用 mgo 作为 mongodb 的驱动程序)。

更新

对于部分更新 mongoDB 中的文档,(最佳)解决方案是转换为地图并删除不需要的字段。从 struct 转换为 map 请参考我的另一篇文章


原帖

我从客户端 javascript 接收数据并写入我的结构模型。但我不想更改/更新某些字段,因此我需要将我的结构转换为 amap[string]interface{}以删除不需要的字段。

将结构转换为 json 然后映射它是不行的,因为字段类型没有被保留。例如,让以下结构为Image model

到目前为止一切顺利,但是当我从客户端(即 javascript)接收信息时,视图字段是一个字符串。如果我将客户端提供的 json 输入转换为映射,则 views 字段仍然是一个字符串,并且该值的内部表示在数据库中发生更改。所以下次我从数据库中读取这个图像时,Views 字段被清零(因为它是来自数据库的字符串表示形式)。

因此,我将来自客户端的 json 输入写入结构中(用于正确转换 Views 变量)。但是所有者值不应该改变(单一形式的数据库)。所以我需要再次将结构转换为 map[string]interface{} 并在数据库中进行更新之前处理该映射。

为此使用 json 包不是一个选项,因为 Views 字段中的字符串标记将从 int 转换为字符串(在转换为地图时)。

到目前为止,我已经尝试了以下将结构转换为映射的功能,并且我使用反射包并且是使用它的菜鸟。不太了解这个包。

如果您能提出一些想法,我将不胜感激。谢谢。

0 投票
3 回答
17366 浏览

mongodb - 使用 mgo 将数据插入 MongoDB

我正在尝试使用 Go 在 MongoDB 中插入一些数据。

这是数据结构:

这是我的插入功能:

最后,这就是我所说的:

问题是,我期待我的bson标签能神奇地工作,但事实并非如此。而不是将数据保存为:

{“_id”:ObjectId(“53700d9cd83e146623e6bfb4”),“resource_id”:7660708,“word”:“Foo”...}

它被保存为:

{“_id”:ObjectId(“53700d9cd83e146623e6bfb4”),“id”:“”,“resourceid”:7660708,“word”:“Foo”...}

我怎样才能解决这个问题?

0 投票
4 回答
10786 浏览

unit-testing - Go:如何为多个包运行测试?

我在 src/ 下的子目录下有多个包,运行每个包的测试都go test可以正常工作。

当尝试运行所有测试时go test ./...,测试正在运行但它失败了..

测试针对本地数据库服务器运行,每个测试文件都有带有 db 指针的全局变量。

我试图运行测试-parallel 1以防止数据库中的争用,但测试仍然失败。

这里有什么问题?

编辑:某些测试因缺少数据库条目而失败,我在每次测试之前和之后完全清除了数据库。我能想到为什么会发生这种情况的唯一原因是因为测试之间存在一些争用。

编辑2:

我的每个测试文件都有 2 个全局变量(使用 mgo):

它还具有以下设置和拆卸功能:

每个测试都使用setUp()和启动defer tearDown()

cfg 也是:

编辑 3:

我将 cfg 更改为使用随机数据库,测试通过了。似乎来自多个包的测试在某种程度上是并行运行的。

是否可以强制go test跨包按顺序运行所有内容?