标签: mongo-go

go mongo 驱动程序更新无法将对象数组设置为空

我的 mongo db 中有与此文档类似的文档

{
    "_id": ObjectId("5cbf416ec6490b9baff4d284"),
    "rewards" : [ 
        {
            "percent" : NumberLong(100),
            "promotion_id" : "promotest"
        }
    ],
    "eligible_for": ["XYZ","ABC"]

}
Run Code Online (Sandbox Code Playgroud)

当我用正确的文档更新时,它正在正确更新文档

但是当我通过奖励时,qualified_for 为 null,然后qualified_for 更新为 null 但奖励未更新为 null

{
    "rewards" : null,
    "eligible_for": null

}
Run Code Online (Sandbox Code Playgroud)

然后是新更新的文档

{
    "_id": ObjectId("5cbf416ec6490b9baff4d284"),
    "rewards" : [ 
        {
            "percent" : NumberLong(100),
            "promotion_id" : "promotest"
        }
    ],
    "eligible_for": null

}
Run Code Online (Sandbox Code Playgroud)

这是我用来使用 mongo-go-driver 更新文档的查询。 r.PollingGameCollection.UpdateOne(ctx, bson.M{"_id": poll.RawId}, M{"$set": poll})

对象是:

type PollingGame struct {

    RawId        *objectid.ObjectID   `json:"-" bson:"_id,omitempty"`

    Rewards     *[]Reward `json:"rewards,omitempty" bson:"rewards,omitempty"`

   EligibleFor  []string `json:"eligible_for,omitempty" …
Run Code Online (Sandbox Code Playgroud)

go mongodb mongo-go

4
推荐指数
1
解决办法
1011
查看次数

使用 Go Mongo-Driver 和 mtest 从 UpdateOne 模拟 UpdateResult

我正在尝试使用该mtest包(https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo/integration/mtest)对我的 MongoDB 调用执行一些模拟结果测试,但我可以似乎不知道如何正确模拟调用集合*mongo.UpdateResult时返回的值。UpdateOne(...)

这是演示该问题的片段:

package test

import (
    "context"
    "errors"
    "testing"

    "github.com/stretchr/testify/assert"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/integration/mtest"
)

func UpdateOneCall(mongoClient *mongo.Client) error {
    filter := bson.D{{Key: "SomeIDField", Value: "SomeID"}}
    update := bson.D{{Key: "$set", Value: bson.D{{Key: "ANewField", Value: true}}}}
    collection := mongoClient.Database("SomeDatabase").Collection("SomeCollection")
    updateResult, err := collection.UpdateOne(context.Background(), filter, update)
    if err != nil {
        return err
    }
    if updateResult.ModifiedCount != 1 {
        return errors.New("no field was updated")
    }
    return nil
}

func TestUpdateOneCall(t *testing.T) {
    mt := …
Run Code Online (Sandbox Code Playgroud)

mocking go mongodb mongo-go mongo-go-driver

4
推荐指数
1
解决办法
1455
查看次数

观察MongoDB Change Streams

我们希望Go应用程序监听集合上的数据更改.因此,谷歌搜索解决方案时,我们遇到了MongoDB的Change Streams.该链接还展示了一些语言的一些实现片段,如Python,Java,Nodejs等.但是,Go没有任何代码.

我们使用Mgo作为驱动程序,但无法找到有关更改流的明确声明.

有没有人知道如何使用Mgo或Go的任何其他Mongo驱动程序观看Change Streams?

event-handling go mongodb mgo mongo-go

3
推荐指数
2
解决办法
3333
查看次数

Mongo-go如何使用arrayFilter在“对象数组内的对象数组”中查找元素

让我们想象一个像这样的 JSON:

"user": {
  "id": "1234",
  ...some fields,
  "achievements": [
    {
      "scope": "life achievements",
      "list": [
        {"_id": 1, "title": "some text", "gotAt": "some date"},
        {"_id": 2, "title": "some other text", "gotAt": "some date"}
      ]
    },
    {
      "scope": "sport achievements",
      "list": [
        {"_id": 1, "title": "sport", "gotAt": "some date"},
        {"_id": 2, "title": "some other sport", "gotAt": "some date"}
      ]
    },
    {
      "scope": "academic achievements",
      "list": [
        {"_id": 1, "title": "some text", "gotAt": "some date"},
        {"_id": 2, "title": "some other text", "gotAt": …
Run Code Online (Sandbox Code Playgroud)

go mongodb mgo mongo-go

3
推荐指数
1
解决办法
3735
查看次数

如何使用Go官方驱动执行addToSet?

我需要addToSet使用官方 Go MongoDB 驱动程序进行操作。

在 MongoDB 中我们有一些文档:

{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }
Run Code Online (Sandbox Code Playgroud)

然后执行addToSet

db.inventory.update(
   { _id: 2 },
   { $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
)
Run Code Online (Sandbox Code Playgroud)

结果:

{
  _id: 2,
  item: "cable",
  tags: [ "electronics", "supplies", "camera", "accessories" ]
}
Run Code Online (Sandbox Code Playgroud)

go mongodb mongo-go

3
推荐指数
1
解决办法
2482
查看次数

mongo-go-driver:嵌套 OR/AND 查询过滤器

我尝试使用嵌套运算符(OR/AND/...)创建 MongoDB 查询过滤器。但 lib 需要创建 abson.D并向bson.E其中传递元素。如果我需要放在OR/AND里面AND/OR- 我需要像这样放在bson.M + bson.D里面:bson.D

filter := bson.M{"$and": bson.D{{"p", 10}, bson.M{"$or": bson.D{{"s", 30}, {"a", 1}}}}}
Run Code Online (Sandbox Code Playgroud)

..当然它不起作用:cannot use primitive.M literal (type primitive.M) as type primitive.E in slice literal. 如果稍后我尝试... in []在 a 中使用逻辑,可能会发生同样的问题bson.D

如何在 Go 和官方 MongoDB 驱动程序中创建此类嵌套查询?

go mongodb mongo-go

3
推荐指数
1
解决办法
5425
查看次数

Mongo Go 驱动程序 - 内联嵌入式结构不起作用

在开发 Golang Mongo Driver 时,我遇到了这种奇怪的使用行为inline

似乎bson:",inline"不适用于Embedded Structs.

无法理解为什么会有这样的行为?

inline Inline the field, which must be a struct or a map, causing all of its fields or keys to be processed as if they were part of the outer struct. For maps, keys must not conflict with the bson keys of other struct fields.

import (
    "context"
    "encoding/json"
    "fmt"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

//Expected Output
//{
//  "ID": "5e6e96cb3cfd3c0447d3e368",
//  "product_id": "5996",
//  "Others": { …
Run Code Online (Sandbox Code Playgroud)

go mongodb bson mongo-go

3
推荐指数
1
解决办法
3227
查看次数

在golang中使用mongo,在指定的秒数后使文档过期?

我正在尝试使用mongo-go-driver进行一些简单的操作。我在集合中插入一些数据,我希望它们在几秒钟后自动删除。

我已阅读以下文档:https://docs.mongodb.com/manual/tutorial/expire-data/#expire-documents-after-a-specified-number-of-seconds

然后我在GO中写了一些东西,但它似乎没有按照我的预期工作。也许有些东西我没有得到,或者我做错了。

package main

import (
    "bytes"
    "context"
    "fmt"
    "log"
    "text/tabwriter"
    "time"

    "github.com/Pallinder/go-randomdata"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    ctx := context.TODO()

    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        log.Fatal(err)
    }
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }

    db := client.Database("LADB")
    col := db.Collection("LACOLL")

    // add index to col
    // the goal is to set a TTL for datas to only 1 secondes (test purpose)
    model := mongo.IndexModel{
        Keys: …
Run Code Online (Sandbox Code Playgroud)

go ttl mongodb mongo-go

3
推荐指数
1
解决办法
2506
查看次数

使用 FindAndModify 在官方 Mongo Go 驱动程序中运行查询

在社区驱动的 Go 的 Mongo 驱动程序(即 Mgo)中,我们可以使用API 调用来运行涉及或 的ApplyMongoDB 查询。Mgo 中此用例的示例如下:$set$inc

change := mgo.Change{
    Update:    bson.M{"$set": bson.M{"phone": "+55 53 8402 8510"}},
    ReturnNew: true,
}
_, err = MongoSession.DB("test").C("people").Find(bson.M{"_id": a}).Apply(change, &result)
Run Code Online (Sandbox Code Playgroud)

引用这个API调用的官方文档:

Apply 运行 findAndModify MongoDB 命令,该命令允许更新、更新插入或删除与查询匹配的文档,并自动返回文档的旧版本(默认)或新版本(当 ReturnNew 为 true 时)。

我目前正在致力于将一个项目从Mgo移植到官方 Mongo Go 驱动程序。但是,我无法找到任何运行 findAndModify 命令来实现类似用例的方法。如果要将Apply API替换为官方驱动程序中的相关方法,推荐的方法是什么?

我考虑过检查现有代码中“更新”下的查询,并手动使用官方驱动程序中提供的查找/更新/替换方法。但是,还有更好的方法来做同样的事情吗?

go mongodb mgo mongo-go

2
推荐指数
1
解决办法
2558
查看次数

mongo-go-driver 中的自定义 UnmarshalBSON

我希望有某种“钩子”,只要我从数据库中获取特定类型的对象,它就会运行。我认为该Unmarshaler接口非常适合此目的,但是...我如何实现该接口,而无需自己手动解组每个字段?

我想做这样的事情:

func (t *T) UnmarshalBSON(b []byte) error {
    // Simply unmarshal `b` into `t` like it would otherwise
    bson.Unmarshal(b, t) // Obviously this won't work, it'll be an infinite loop
    // Do something here
    return nil
}
Run Code Online (Sandbox Code Playgroud)

在不使用 Reflect pkg 手动解组字段的情况下,如何实现此目的?

go mongo-go

2
推荐指数
1
解决办法
2055
查看次数

标签 统计

go ×10

mongo-go ×10

mongodb ×9

mgo ×3

bson ×1

event-handling ×1

mocking ×1

mongo-go-driver ×1

ttl ×1