MongoDB Автоинкрементный идентификатор с Golang mon go -драйвером - PullRequest
0 голосов
/ 07 апреля 2020

Основываясь на документации , go.mongodb.org/mongo-driver, по-видимому, не предоставляет способ автоматического увеличения идентификатора при загрузке документа, который не предоставил идентификатор.

    type Document struct {
        ID             int    `bson:"_id"`
        Foo            string `bson:"foo"`
    }

    document := &Document{Foo: "test"}

    filter := bson.M{"_id": bson.M{"$eq": document.ID}}
    update := bson.M{"$set": document}

    res, err := mongoClient.Database(dbName).
        Collection(collectionName).
        UpdateOne(ctx, filter, update,
            options.Update().SetUpsert(true))

В приведенном выше примере кода для ID будет установлено нулевое значение int, равное 0, и оно будет сохранено в MongoDB как {"_id":0,"foo":"test"}.

Существует ли чистый способ автоматического увеличения идентификатора, когда идентификатор не предоставляется с помощью mongo-driver, без выполнения логики c самостоятельного отслеживания последнего идентификатора? Скажем, например, что в БД уже есть 5 документов, тогда выполнение приведенного выше кода будет сохраняться {"_id":6,"foo":"test"}, если идентификатор не указан.

1 Ответ

0 голосов
/ 27 апреля 2020

Я нашел ту же проблему, решение, которое я думал, заключалось в определении структуры Document без идентификатора:

type Document struct {
    Foo string `bson:"foo"`
}

Затем, если операция InsertOne выполняется с помощью драйвера mon go:

res, err := mongoClient.Database(dbName).Collection(collectionName).InsertOne(ctx, document)

В базе данных будет автоматически создан _id (Вы можете повторить операцию InsertOne несколько раз и появятся новые _id s).

Документация mongodb объясняет это поведение: "Если в документе не указано поле _id, то mongod добавит поле _id и назначит уникальный ObjectId для документа перед вставкой. " (Вы можете прочитать более подробную информацию в https://docs.mongodb.com/manual/reference/method/db.collection.insertOne/#db .collection.insertOne )

В случае, если вам нужен новый созданный _id по какой-то причине вы можете использовать следующий фрагмент в качестве ссылки для его извлечения:

fmt.Println("New Document created with mongodb _id: " + res.InsertedID.(primitive.ObjectID).Hex())

( primitive.ObjectID связано с этим: import "go .mongodb.org / mon go -driver / bson / primitive ")

Ho это помогает!

...