#mongodb #go #mgo
#mongodb #Вперед #mgo
Вопрос:
У меня возникли трудности с преобразованием запроса MongoDB в mgo bson. Схема записи Mongo такова, как показано ниже. Я хочу найти записи, в которых есть темы с метками «Образование» и «Студенты».
db.questions.insert
(
{
"_id" : ObjectId("5cb4048478163fa3c9726fdf"),
"questionText" : "why?",
"createdOn" : new Date(),
"createdBy": user1,
"topics" : [
{
"label": "Education",
},
{
"label": "Life and Living",
},
{
"label": "Students"
}
]
}
)
Используя Robo 3T, запрос выглядит следующим образом:
db.questions.find({$and : [
{"topics": {"label": "Students"}},
{"topics": {"label": "Education"}}
]})
У меня возникли проблемы с моделированием этого с помощью MGO. В настоящее время я пробовал это:
map[$and:[
map[topics:map[label:students]]
map[topics:map[label:life and living]]
]]
и это
map[topics:map[$and:[
map[label:students]
map[label:life and living]
]]]
Ответ №1:
Если вы хотите найти какое-либо значение из вложенного массива, тогда вы используете метод $elemMatch.
db.questions.find(
{$and:
[
{topics: {$elemMatch: {label: 'Students'}}},
{topics: {$elemMatch: {label: 'Education'}}}
]
}
)
Комментарии:
1. Используя ваш пример, я попробовал map[$and:[карта[темы: карта[$elemMatch:карта[ярлык: студенты]]] карта[темы: карта[$elemMatch: карта[ярлык: жизнь и быт]]]]] Но он вернулся пустым. Мой запрос выше работает так, как ожидалось. Я просто не могу отобразить его в MGO.
2. Действительно, он работает в Rob 3T, как и мой запрос выше. Но я не могу заставить ни того, ни другого работать с MGO. Я уверен, что есть какой-то способ сопоставить этот запрос с bson.M, но я не могу понять, как это сделать.
3. Я решил проблему с bson и опубликовал подробности ниже. Спасибо.
Ответ №2:
Модель bson для приведенного выше ответа выглядит следующим образом:
query = getAndFilters(
bson.M{"topics": bson.M{"$elemMatch": bson.M{"label": "Students"}}},
bson.M{"topics": bson.M{"$elemMatch": bson.M{"label": "Education"}}})