Nodejs + mongodb : How to query $ref fields?

Fred Mériot picture Fred Mériot · Oct 30, 2013 · Viewed 16.8k times · Source

I'am using MongoDB with a nodejs REST service which exposes my data stored inside. I have a question about how to interrogate my data which uses $ref.

Here is a sample of an Object which contains a reference to another object (detail) in anther collection :

{
    "_id" : ObjectId("5962c7b53b6a02100a000085"),
    "Title" : "test",
    "detail" : {
        "$ref" : "ObjDetail",
        "$id" : ObjectId("5270c7b11f6a02100a000001")
    },
    "foo" : bar
}

Actually, using Node.js and mongodb module, I do the following :

db.collection("Obj").findOne({"_id" : new ObjectID("5962c7b53b6a02100a000085"},
function(err, item) {
    db.collection(item.$ref).findOne({"_id" : item.$id}, function(err,subItem){
        ...
    });
});

In fact I make 2 queries, and get 2 objects. It's a kind of "lazy loading" (not exactly but almost)

My question is simple : is it possible to retrieve the whole object graph in one query ?

Thank you

Answer

Brett picture Brett · Oct 30, 2013

No, you can't.

To resolve DBRefs, your application must perform additional queries to return the referenced documents. Many drivers have helper methods that form the query for the DBRef automatically. The drivers do not automatically resolve DBRefs into documents.

From the MongoDB docs http://docs.mongodb.org/manual/reference/database-references/.