запрос mongodb с динамическим переходом

#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)