【问题标题】:How to filter fields from a mongo document with the official mongo-go-driver如何使用官方 mongo-go-driver 从 mongo 文档中过滤字段
【发布时间】:2019-04-06 18:56:39
【问题描述】:

如何使用 mongo-go-driver 过滤字段。 用 findopt.Projection 尝试过,但没有成功。

type fields struct {
    _id int16
}

s := bson.NewDocument()
filter := bson.NewDocument(bson.EC.ObjectID("_id", starterId))

var opts []findopt.One
opts = append(opts, findopt.Projection(fields{
    _id: 0,
}))

staCon.collection.FindOne(nil, filter, opts...).Decode(s)

最后,我想抑制字段“_id”。但文件没有改变。

【问题讨论】:

    标签: mongodb go struct projection mongo-go


    【解决方案1】:

    编辑:随着 mongo-go 驱动程序的发展,可以使用简单的bson.M 指定投影,如下所示:

    options.FindOne().SetProjection(bson.M{"_id": 0})
    

    原始(旧)答案如下。


    它对您不起作用的原因是因为字段fields._id 未导出,因此没有其他包可以访问它(只有声明包)。

    您必须使用导出的字段名称(以大写字母开头),例如ID,并使用 struct tags 将其映射到 MongoDB _id 字段,如下所示:

    type fields struct {
        ID int `bson:"_id"`
    }
    

    现在使用投影执行查询:

    projection := fields{
        ID: 0,
    }
    result := staCon.collection.FindOne(
        nil, filter, options.FindOne().SetProjection(projection)).Decode(s)
    

    请注意,您也可以使用bson.Document 作为投影,您不需要自己的结构类型。例如。以下内容相同:

    projection := bson.NewDocument(
        bson.EC.Int32("_id", 0),
    )
    result := staCon.collection.FindOne(
        nil, filter, options.FindOne().SetProjection(projection)).Decode(s)
    

    【讨论】:

    • 那太复杂了,我真的需要定义一个结构吗?或者我可以使用 bson.M ?
    • @LoboNokeweNgewe 是的,您也可以使用 bson.M 值。由于创建了这个答案,mongo-go 驱动程序改进了很多。
    • 多个投影字段使用bson.D{{"_id", 0}, {"name", 1}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2019-05-21
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多