为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查密钥是否存在于蒙哥DB中

如何检查密钥是否存在于蒙哥DB中

Go
长风秋雁 2022-09-12 16:07:56
我正在尝试检查MongoDB集合中是否存在密钥。基本上,我需要将字符串数组映射到特定键。如果该键存在,我想通过添加新值来更新列表,否则创建一个具有初始值的新键(如果添加了新键,则最初只会添加1个值)。我在网上找到了一些例子,尽管我无法让它在本地工作。以下是我的代码(我使用的是官方的Go MongoDB驱动程序):key:= "some_key" database := client.Database("dbName") keysCollection := database.Collection("keys") keysCollection.Find(nil, {key:{$exists:true}});我遇到2个关于这个组件的问题{key: {$exists:true}}invalid character U+0024 '$':当尝试检查 是否存在时,在 ,尽管这似乎是 MongoDB 文档支持检查密钥本身是否存在的内容,而不检查映射到它的确切值。key{$exists:true}syntax error: unexpected {, expecting expression:在的开头,看起来我无法通过结构?{key: {$exists:true}}这是我第一次使用MongoDB,我在GoLang方面的经验很少,并且被困在这个看似很小的问题上。我这样做是正确的吗?如果是这样,我该如何解决这些问题?
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

要检查集合中是否存在键,下面分别是 shell 和 golang 中的查询。假设示例文档的集合为:mongo


{ _id: 1, arr: [ "red", "blue" ] }

{ _id: 2  }

查询:


db.collection.find( { "arr": { "$exists": true } } )

请参阅$exists的用法。


var result bson.M

filter := bson.D{{ "arr", bson.D{{ "$exists", true }} }}

err = collection.FindOne(context.TODO(), filter).Decode(&result)

if err != nil {

    log.Fatal(err)

}

fmt.Printf("Found a single document: %+v\n", result)


我正在尝试检查MongoDB集合中是否存在密钥。我需要将字符串数组映射到特定键。如果该键存在,我想通过添加新值来更新列表,否则创建一个具有初始值的新键(如果添加了新键,则最初只会添加1个值)。


若要根据条件更新字段,需要使用聚合管道进行更新。以下 shell 和 golang 查询使用条件更新所有文档 - 如果数组字段存在,则添加来自 的值,或者如果该字段不存在,则使用来自的值创建一个新字段。newValuearrnewValue


var newValue = "white"


db.collection.updateMany(

  { },

  [ { 

       $set: { 

           arr: { 

               $concatArrays: [ 

                   { $ifNull: [ "$arr", [ ] ] }, 

                   [ newValue ] 

               ] 

           } 

       } 

  } ]

)

戈朗更新:


newValue := "white"

filter := bson.D{{}}


pipe := bson.D{{ "$set", bson.D{{ "arr", bson.D{{ "$concatArrays", bson.A{ bson.D{{"$ifNull",bson.A{ "$arr", bson.A{} }}}, bson.A{ newValue } } }} }} }}

    

updateResult, errr := collection.UpdateMany(ctx, filter, mongo.Pipeline{ pipe })

    

if errr != nil {

    log.Fatal(errr)

}

fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)



查看完整回答
反对 回复 2022-09-12
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

试试这个

var res []MyType
err := keysCollection.Find(ctx, bson.M{key: bson.M{"$exists": true}}, &res)


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信