假设我有如下代码:

        var result bson.M
        err := coll.FindOne(context.TODO(), filter).Decode(&result)
        if err != nil {
            panic(err)
        }
        // somehow I can change the _id before I do insertOne
        if _, err := coll.InsertOne(context.TODO(), result); err != nil {
            panic(err)
        }

有没有一种方法可以在不知道数据 struct 的情况下插入一个?但在插入之前,我必须更改_id.

推荐答案

MongoDB中的ID字段始终为_id,因此您可以简单地这样做:

result["_id"] = ... // Assign new ID value

也请注意,bson.M是一张 map ,因此不保留秩序.您可以只更改ID并插入克隆,但字段顺序可能会改变.这通常不是问题.

如果顺序也很重要,请使用bson.D而不是保持顺序的bson.M,但查找_id稍微复杂一些:您必须使用循环,因为bson.D不是映射,而是切片.

以下是使用bson.D时的结果:

var result bson.D
// Query...

// Change ID:
for i := range result {
    if result[i].Key == "_id" {
        result[i].Value = ... // new id value
        break
    }
}

// Now you can insert result

Mongodb相关问答推荐

如何从文档列表的数组内部打印一个对象?

查找/查找单个深度嵌套文档的多个集合

Mongo DB-如果一个特定字段有多个文档匹配,则更新文档字段

如何修改 mongodb 中嵌套对象数组中的字段名称/键?

在mongoose 中按键查找嵌套对象

如何在 2 个应用程序之间共享mongoose模型?

从 node.js 的 mongodb 集合中删除文档

mongo php副本连接非常慢

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

MongoDB 存储 ObjectId 的数组

MongoDB 3 Java判断集合是否存在

Python - Pymongo 插入和更新文档

在 Postgres JSON 数组中查询

从每个组中 Select 前 N 行

MongoException: Index with name: code already exists with different options

如何使用 MongoDB C# 驱动程序有条件地组合过滤器?

使用 mongodb 在数组中查找子文档

查询不等于 null 或空的地方

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小

Mongodb 查找除一两个条件之外的所有内容