如何使用具有匹配属性的对象数组检索mongo文档

时间:2019-11-08 12:31:34

标签: mongodb go mgo

我有一个用户文档集合,每个文档都有一个嵌入式客户端。数组中的每个对象都有一个clientID。

我想在clients数组中使用一个client来检索用户文档,该client具有与传递的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 个答案:

答案 0 :(得分:1)

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)