Cabbage soup
Cabbage soup

Reputation: 1394

nested field query for mongodb (using ruby)

Sup, good folks of the internet.

Does anyone know how to make nested queries for mongodb? This is probably best explained by an example. To retrieve specific fields, I can use the :fields option to retrieve that field (e.g. suppose it is called "useful_field"):

    collection.find({},{:fields => {"useful_field" => 1}})

But suppose that useful_field itself contains an array of many further fields, i.e

    useful_field = [{"value_I_want"=>"useful","value_I_dont_want"=>"not_useful"}]

My aim is to select "value_I_want". Any thoughts?

Here is a specific entry that I am trying to deal with (a reply to a tweet):

    { "_id" : ObjectId("51b6f71b0364718d71e4bca5"), 
    "annotations" : { }, 
    "resultType" : "Tweet", 
    "score" : 1, 
    "groupName" : "TweetsWithConversation",
    "results" : [
            {   
                "kind" : "Tweet",   
                "score" : 1,    
                "annotations" : {   "ConversationRole" : "Ancestor" },
              "value" : {   "created_at" : "Fri Jun 07 19:47:51 +0000 2013",    
                          "id" : NumberLong("343091955196104704"),  
                          "id_str" : "343091955196104704",  
                          "text" : "THIS_IS_WHAT_I_WANT",
                       etc. etc. (Apologies for the odd formatting)

I'm trying to use a method of the form that will let me do something like this:

    db.collection.find({},{:fields { some_way_of_selecting(THIS_IS_WHAT_I_WANT)})

(I'm querying as part of a ruby script)

Otherwise, I'll have to go back into the dark world of regex. No-one wants that.

Upvotes: 0

Views: 1139

Answers (2)

Asya Kamsky
Asya Kamsky

Reputation: 42342

What you are trying to do is called "projection" - it's specifying what fields you want returned in the second argument to find.

In your case you simply want:

db.collection.find({}, {"results.value.text":1} ) 

Upvotes: 0

seeshing
seeshing

Reputation: 26

Try the following

db.collection.find({},{"useful_field.value_I_want": 1})

Maybe try this:

db.collection.find({"resultType" : "Tweet"}, {"results" : {$elemMatch : {"value.text" : "THIS_IS_WHAT_I_WANT"}}})

Upvotes: 1

Related Questions