加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang mongodb mgo driver Upsert / UpsertId文档

发布时间:2020-12-16 09:26:15 所属栏目:大数据 来源:网络整理
导读:mongodb documentation说: 如果参数仅包含更新运算符表达式,则参数和参数的字段和值.此更新根据参数中的等于子句创建基本文档,然后应用参数中的更新表达式. 而mgo documentation说: Upsert查找与提供的选择器文档匹配的单个文档,并根据更新文档对其进行修
mongodb documentation说:

如果参数仅包含更新运算符表达式,则参数和参数的字段和值.此更新根据参数中的等于子句创建基本文档,然后应用参数中的更新表达式.

而mgo documentation说:

Upsert查找与提供的选择器文档匹配的单个文档,并根据更新文档对其进行修改.如果找不到与选择器匹配的文档,则将更新文档应用于选择器文档,并将结果插入到集合中.

但如果我像这样做一个upsert:

session.UpsertId(data.Code,data)

我最终得到一个条目,它具有由mongodb自动生成的ObjectID,而不是data.Code.

这意味着UpsertId期望使用更新运算符格式化数据,并且您不能使用任意结构?或者我在这里失踪了什么?

钯. Mongo 2.4.9 mgo v2 golang go version devel f613443bb13a

编辑:

这是我的意思的样本,使用Neil Lunn的示例代码:

package main

import (
  "fmt"
  "gopkg.in/mgo.v2"
  // "gopkg.in/mgo.v2/bson"
)

type Person struct {
  Code string
  Name  string
}

func main() {
  session,err := mgo.Dial("admin:admin@localhost");

  if err != nil {
        fmt.Println("Error: ",err)
        return
    // panic(err)
  }

  defer session.Close()

  session.SetMode(mgo.Monotonic,true)

  c := session.DB("test").C("people")

  var p = Person{
    Code: "1234",Name: "Bill",}

  _,err = c.UpsertId( p.Code,&p )

  result := Person{}
  err = c.FindId(p.Code).One(&result)
  if err != nil {
        fmt.Println("FindId Error: ",err)
        return
    // panic(err)
  }

  fmt.Println("Person",result)

}

解决方法

我发现MongoDB的文档是对的.执行此操作的正确方法是将结构包装到插入更新运算符中.

Neil Lunn提供的示例代码如下所示:

package main

import (
  "fmt"
  "gopkg.in/mgo.v2"
  "gopkg.in/mgo.v2/bson"
)

type Person struct {
  Code string
  Name  string
}

func main() {
  session,err)
        return
  }

  defer session.Close()

  session.SetMode(mgo.Monotonic,}
    upsertdata := bson.M{ "$set": p}

    info,err2 := c.UpsertId( p.Code,upsertdata )
    fmt.Println("UpsertId -> ",info,err2)
  result := Person{}
  err = c.FindId(p.Code).One(&result)
  if err != nil {
        fmt.Println("FindId Error: ",err)
        return
  }

  fmt.Println("Person",result)

}

非常感谢您的关注和帮助Neil.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读