Как строить запросы с операторами сравнения, используя официальный драйвер mongodb?
Мне нужно построить запрос, используя операторы сравнения, эквивалент db.inventory.find( { qty: { $gt: 20 }
используя официальный драйвер. Есть идеи, как это сделать?
1 ответ
Подключение к серверу это что-то вроде:
client, err := mongo.NewClient("mongodb://foo:bar@localhost:27017")
if err != nil { log.Fatal(err) }
err = client.Connect(context.TODO())
if err != nil { log.Fatal(err) }
Тогда получите inventory
mongo.Collection
лайк:
coll := client.Database("baz").Collection("inventory")
Затем вы можете выполнить свой запрос, используя Collection.Find()
лайк:
ctx := context.Background()
cursor, err := coll.Find(ctx,
bson.NewDocument(
bson.EC.SubDocumentFromElements("qty",
bson.EC.Int32("$gt", 20),
),
),
)
defer cursor.Close(ctx) // Make sure you close the cursor!
Чтение результатов с использованием mongo.Cursor
:
doc := bson.NewDocument()
for cursor.Next(ctx) {
doc.Reset()
if err := cursor.Decode(doc); err != nil {
// Handle error
log.Printf("cursor.Decode failed: %v", err)
return
}
// Do something with doc:
log.Printf("Result: %v", doc)
}
if err := cursor.Err(); err != nil {
log.Printf("cursor.Err: %v", err)
}
Примечание: я использовал один bson.Document
Значение, чтобы прочитать все документы, и использовал его Document.Reset()
в начале каждой итерации, чтобы очистить его и "подготовить", чтобы прочитать в него новый документ. Если вы хотите хранить документы (например, в срезе), то вы, очевидно, можете этого не делать. В этом случае просто создайте новый документ в каждой итерации, как doc := bson.NewDocument()
,