Как получить монго-документ с массивом объектов, имеющих соответствующий атрибут - PullRequest
1 голос
/ 08 ноября 2019

У меня есть коллекция пользовательских документов, каждый со встроенным массивом клиентов. Каждый объект в массиве имеет идентификатор клиента.

Я хотел получить пользовательский документ с клиентом, в массиве клиентов, у которого clientID совпадает с переданным clientID.

Но все примеры, с которыми я сталкивался, просто извлекают объект вместо этоговозврата документа. Я хотел сделать это, используя библиотеку mgo

var results []model.Clients   
err := db.C("users").Find(nil).Select(bson.M{"clients": bson.M{"$elemMatch":q }}).All(&results)

. Выше приведен только массив клиентов. Но я хотел массив пользователей.

[
    {
        "userID": "1",
        clients: [
            {
                "clientID": "12",
                "data": {},
                "customers": [
                    "customerID": "0123",
                    "data": {

                    }
                ]
            },
            {
                "clientID": "123",
                "data": {},
                "customers": [
                    "customerID": "0123",
                    "data": {

                    }
                ]
            }
        ]
    },
    {
        "userID": "2",
        clients: [
            {
                "clientID": "12",
                "data": {},
                "customers": [
                    "customerID": "0123",
                    "data": {

                    }
                ]
            },
            {
                "clientID": "13",
                "data": {},
                "customers": [
                    "customerID": "0123",
                    "data": {

                    }
                ]
            }
        ]
    }
]

1 Ответ

1 голос
/ 08 ноября 2019

Query.Select() позволяет выбрать, какие поля следует извлекать для результатов, а не для определения критериев фильтра. Критерий фильтра должен быть передан в Collection.Find().

var results []model.User   
err := db.C("users").Find(bson.M{"clients": bson.M{"$elemMatch":q}}).All(&results)

Вы также можете использовать "clients.clientID" для обозначения clientID в массиве clients:

var results []model.User   
err := db.C("users").Find(bson.M{"clients.clientID": "12"}).All(&results)
...