在嵌套数组中获取具有特定ObjectId的数组对象

I'm trying to get a specific array of objects depending on ObjectId they have.

Here is my MongoDB database:

{
    "_id" : ObjectId("59edb571593904117884b721"),
    "userids" : [
            ObjectId("59edb459593904117884b71f")
    ],
    "macaddress" : "MACADDRESS",
    "devices" : [ ],
    "projectorbrand" : "",
}
{
    "_id" : ObjectId("59edb584593904117884b722"),
    "userids" : [
            ObjectId("59edb459593904117884b71f"),
            ObjectId("59e4809159390431d44a9438")
    ],
    "macaddress" : "MACADDRESS2",
    "devices" : [ ],
    "projectorbrand" : "",
}

The command in MongoDB is:

db.getCollection('co4b').find( {
    userids: { $all: [ ObjectId("59edb459593904117884b71f") ] }
} )

This will work and will return an array filtered correctly. I would like to translate this query in Golang.

Here is my code:

pipe := bson.M{"userids": bson.M{"$all": objectId}}
var objects[]models.Objects
if err := uc.session.DB("API").C("objects").Pipe(pipe).All(&objects); err != nil {
    SendError(w, "error", 500, err.Error())
} else {
    for i := 0; i < len(objects); i++ {
        objects[i].Actions = nil
    }
    uj, _ := json.MarshalIndent(objects, "", " ")
    SendSuccessJson(w, uj)
}

I'm getting error like wrong type for field (pipeline) 3 != 4. I saw that $all needs string array but how to filter by ObjectId instead of string?

Thanks for help

You are attempting to use the aggregation framework in your mgo solution, yet the query you try to implement does not use one (and does not need one).

The query:

db.getCollection('co4b').find({
    userids: {$all: [ObjectId("59edb459593904117884b71f")] }
})

Can simply be transformed to mgo like this:

c := uc.session.DB("API").C("objects")

var objects []models.Objects
err := c.Find(bson.M{"userids": bson.M{
    "$all": []interface{}{bson.ObjectIdHex("59edb459593904117884b71f")},
}}).All(&objects)

Also note that if you're using $all with a single element, you can also implement that query using $elemMatch, which in MongoDB console would like this:

db.getCollection('co4b').find({
    userids: {$elemMatch: {$eq: ObjectId("59edb459593904117884b71f")}}
})

Which looks like this in mgo:

err := c.Find(bson.M{"userids": bson.M{
    "$elemMatch": bson.M{"$eq": bson.ObjectIdHex("59edb459593904117884b71f")},
}}).All(&objects)