1

I'm working in go language. I'm using mgo driver to get the data from mongodb. I want last entry from the events array.

There will be huge data in future. so I don't want to read the whole record but just want specific data from the record.

db.events.find({"_id":"59ce53b9-970a-44a2-8419-b41a99120b25"},{"events":{$slice:-1}}).pretty()

this is working in mongo shell. I want this to work in go lang.

This is the sample data, from which I want last entry present in events.

    {
    "_id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
    "version" : 9,
    "events" : [
        {
            "event_type" : "customer:added",
            "data" : {
                "id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
                "name" : "arjun"
            },
            "timestamp" : ISODate("2017-11-20T12:21:34.910Z"),
            "aggregate_type" : "customer",
            "_id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
            "version" : 1
        },
        {
            "event_type" : "customer:address-updated",
            "data" : {
                "id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
                "address" : "bangalore"
            },
            "timestamp" : ISODate("2017-11-20T12:22:08.496Z"),
            "aggregate_type" : "customer",
            "_id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
            "version" : 2
        }
    ]
}
2
  • this? play.golang.org/p/Lk-wVGrOCW I do not know what ISODate() syntax is so it is just wrapped into a string. Commented Nov 24, 2017 at 10:12
  • It's timestamp. used time package of golang(golang.org/pkg/time). And marshal the struct using bson. Commented Nov 27, 2017 at 9:30

1 Answer 1

1

What you pass as the 2nd argument to find() is a projection.

Projections in mgo can be specified using the Query.Select() method.

So your query in mgo simply looks like this:

sess := ... // Acquire MongoDB session
c := sess.DB("dbname").C("events")

var doc bson.M

err := c.FindId("59ce53b9-970a-44a2-8419-b41a99120b25").
    Select(bson.M{"events": bson.M{"$slice": -1}}).
    One(&doc)

if err != nil {
    // Handle error
}
fmt.Println(len(doc["events"].([]interface{}))) // This prints 1
fmt.Println(doc)
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you.. It worked. I made some improvements like Select(bson.M{"version":0, _id:0, "events": bson.M{"$slice": -1}}) to remove those unwanted parameter out of the ans.

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.