我试图做这样的更新查询:

    coll = client.Database("tedi").Collection("users")

    filter := bson.D{primitive.E{Key: "_id", Value: userID}}
    update := bson.D{primitive.E{Key: "$addToSet", Value: bson.D{primitive.E{Key: "listings", Value: listingID}}}}

    ur, err := coll.UpdateOne(context.TODO(), filter, update)
    if err != nil {
        return "", err
    }

    fmt.Println(ur.MatchedCount)
    fmt.Println(ur.UpsertedCount)
    fmt.Println(ur.ModifiedCount)
    fmt.Println(ur.UpsertedID)

我没有返回任何错误,但是没有任何更新发生,因此我认为update选项的结构不正确。
如果我这样构建:bson.D{{"$addToSet", bson.D{{"listings", listingID}}}},如此处文档所建议:https://godoc.org/go.mongodb.org/mongo-driver/mongo#Collection.UpdateOne,IDE会警告我:go.mongodb.org/mongo-driver/bson/primitive.E composite literal uses unkeyed fields所有ur.*Count变量均为0,而ur.UpsertedID为nil
我正在使用go1.15 Linux / amd64
和go.mongodb.org/mongo-driver v1.4.0

最佳答案

好的,所以我找到了问题。
我必须传递primitive.ObjectID而不是string
我这样做是这样的:

    oid, err := primitive.ObjectIDFromHex(userID)
    if err != nil {
        return err
    }

    filter := bson.D{primitive.E{Key: "_id", Value: oid}}
其余的都一样

关于mongodb - 如何构建bson.D {},我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63646165/

10-16 06:07