MGO запрашивает вложенный массив объектов

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