#mongodb #go #mgo
#mongodb #Вперед #mgo
Вопрос:
Я хотел бы создать динамический запрос mongo, но при поиске в Google я не понимаю, почему первый запрос возвращает null.
matches := []bson.M{bson.M{"$match": bson.M{"age": bson.M{"$gt": 20}}}}
err2 := coll.Find(matches).All(amp;persons)
Это показывает ожидаемые строки:
err2 = coll.Find(bson.M{"age": bson.M{"$gt": 20}}).All(amp;persons)
Не могли бы вы привести простой пример, как построить запрос с двумя параметрами, пожалуйста?
Спасибо.
Комментарии:
1.
Find()
ожидает документ фильтра, и в вашем первом примере вы передаете фрагмент документов. Это не имеет ничего общего с динамичностью. Один документ может содержать несколько фильтров, напримерbson.M{"age": bson.M{"$gt": 20}, "name": "Bob"}
. В чем ваш вопрос?2. Вопрос в том, почему совпадения:= []bson. M{bson. M{«$match»: bson. M{«возраст»: bson. M{«$ gt»: 20}}}} не работает. И как я мог бы динамически объединять несколько фильтров.
Ответ №1:
Ваш первый пример не работает, потому Collection.Find()
что ожидает один документ фильтра, и вы передаете ему фрагмент документов.
Например, один документ может содержать несколько фильтров, bson.M{"age": bson.M{"$gt": 20}, "name": "Bob"}
поэтому на практике это не создает ограничений.
Если у вас есть несколько документов фильтра, и вы хотите применить все, вам нужно «объединить» их в один документ.
Общее решение — создать документ с $and
ключом (если вы хотите, чтобы они были в логическом И соединении, или $or
если вы хотите логическое ИЛИ), значение которого на карте является срезом фильтров (документов).
Вот как это просто:
// filters contains all the filters you want to apply:
filters := []bson.M{
bson.M{"age": bson.M{"$gt": 20}},
bson.M{"name": "Bob"},
}
// filter is a single filter document that merges all filters
filter := bson.M{"$and": filters}
// And then:
err := coll.Find(filter).All(amp;persons)