2

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

2
  • When are you getting the error? While running go code or while compiling it? Commented Oct 23, 2017 at 15:22
  • while running go code Commented Oct 23, 2017 at 15:27

1 Answer 1

2

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)
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much for your clear answer ! It's perfect with $elemMatch !

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.