我可以将数组对象推送到 mongodb 上的空数组吗? (使用去)

Posted

技术标签:

【中文标题】我可以将数组对象推送到 mongodb 上的空数组吗? (使用去)【英文标题】:Can I push array object to empty array on mongodb? (using go) 【发布时间】:2021-08-30 00:21:18 【问题描述】:

我正在尝试通过使用 go 来学习 mongodb。 我试图将数组推送到 mongodb 的空数组。

首先,我创建了一个这样的集合。


    "_id" : ObjectId("60c6c2d7b64d7f9d461d2bd5"),
    "title" : "Test Title",
    "description" : "This is test vote title",
    "candidates" : [ 
        
            "name" : "Test Name",
            "score" : 0,
            "voter" : []
        
    ]

这是我用于 db 的类型

type Vote struct 
    Title       string
    Description string
    Candidates  []Candidate


type Candidate struct 
    Name  string
    Score int
    Voter []Supporter


type Supporter struct 
    UUID string
    Name string

而且,我想要做的是,将数组对象推送到空数组'voter'。 我想将此对象推送到数据库。

[]vote.SupporterUUID: uuid.NewString(), Name: "Test User A", UUID: uuid.NewString(), Name: "Test User B"

然后,我用这个命令推送这个数组对象。

vote.VoteToSubject(collection, "Test Title", "Test Name", []vote.SupporterUUID: uuid.NewString(), Name: "Test User A", UUID: uuid.NewString(), Name: "Test User B")
func VoteToSubject(collection *mongo.Collection, title string, name string, voter []Supporter) 
    // filter := bson.D"title", title, "candidates", bson.D"name", name
    filter := bson.D"$and", []interfacebson.D"title", title, bson.D"candidates.name", name
    update := bson.D"$set", bson.D"candidates.votes", voter
    updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
    if err != nil 
        log.Fatal(err)
    

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

我所期望的是,数组对象被添加到投票空数组中(而不是替换)。


    "_id" : ObjectId("60c6c2d7b64d7f9d461d2bd5"),
    "title" : "Test Title",
    "description" : "This is test vote title",
    "candidates" : [ 
        
            "name" : "Test Name",
            "score" : 0,
            "voter" : [
                
                    "uuid" : *uuid1*
                    "name" : *name1*
            ,  
                    "uuid" : *uuid2*
                    "name" : *name2*
            , 
            ]
        
    ]

但是该命令返回一个错误......就像这样。

ekfkal79@DARAMI-PC MINGW64 ~/go/src/github.com/ekfkal79/go-mongo-db (main)
$ go run main.go
Connected to MongoDB!
2021/06/14 11:45:52 multiple write errors: [write errors: [Cannot create field 'votes' in element candidates: [  name: "Test Name", score: 0, voter: []  ]], <nil>]
exit status 1

我不知道如何解决这个问题...我阅读了 mongodb 的文档,但它没有帮助... 我需要你的帮助...

对不起,我的英语水平不好......

【问题讨论】:

【参考方案1】:

是的,我解决了我的问题!

问题是,我没有指定数组的索引!!

func VoteToSubject(collection *mongo.Collection, title string, name string, voter []Supporter) 
    // filter := bson.D"title", title, "candidates", bson.D"name", name
    filter := bson.D"$and", []interfacebson.D"title", title, bson.D"candidates.name", name
    update := bson.D"$addToSet", bson.D"candidates.$.voter", bson.D"$each", voter
    updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
    if err != nil 
        log.Fatal(err)
    

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

在变量“update”中,我将数组的索引指定为“$”。然后使用'$each'查询非结构化数组'voter'!


    "_id" : ObjectId("60c6c2d7b64d7f9d461d2bd5"),
    "title" : "Test Title",
    "description" : "This is test vote title",
    "candidates" : [ 
        
            "name" : "Test Name",
            "score" : 0,
            "voter" : [ 
                
                    "uuid" : "92b5eff2-b4de-4b48-96d8-9ea41a74c22b",
                    "name" : "Test User A"
                , 
                
                    "uuid" : "f50037ec-d898-4b6e-a836-7cc44e306493",
                    "name" : "Test User B"
                
            ]
        
    ]

效果很好!!

谢谢大家!

【讨论】:

以上是关于我可以将数组对象推送到 mongodb 上的空数组吗? (使用去)的主要内容,如果未能解决你的问题,请参考以下文章

将新项目推送到 mongoDB 文档数组

将新评论推送到 mongoose/mongodb/angularjs 中的评论数组中

我需要使用 graphql 将数组数据推送到 mongodb

搜索并将数组推送到MongoDB中的嵌套对象数组[重复]

使用 mongoose 将字符串数组推送到 mongoDB

如何通过 mongoose 将多个数组元素推送到 mongodb