TripVoltage
TripVoltage

Reputation: 341

Mongo returning an array element

I have the following JSON document in my mongoDB which I added with mingoimport.

I am trying to return a single element from the questions array where theQuestion equals "q1".

     {
  "questions": [
    {
      "questionEntry": {
        "id": 1,
        "info": {
          "seasonNumber": 1,
          "episodeNumber": 1,
          "episodeName": "Days Gone Bye"
        },
        "questionItem": {
          "theQuestion": "q1",
          "attachedElement": {
            "type": 1,
            "value": ""
          }
        },
        "options": [
          {
            "type": 1,
            "value": "o1"
          },
          {
            "type": 1,
            "value": "o1"
          }
        ],
        "answer": {
          "questionId": 1,
          "answer": 1
        },
        "metaTags": [
          "Season 1",
          "Episode 1",
          "Rick Grimmes"
        ]
      }
    },
    {
      "questionEntry": {
        "id": 1,
        "info": {
          "seasonNumber": 1,
          "episodeNumber": 1,
          "episodeName": "Days Gone Bye"
        },
        "questionItem": {
          "theQuestion": "q2",
          "attachedElement": {
            "type": 1,
            "value": ""
          }
        },
        "options": [
          {
            "type": 1,
            "value": "o2"
          },
          {
            "type": 1,
            "value": "o2"
          }
        ],
        "answer": {
          "questionId": 1,
          "answer": 1
        },
        "metaTags": [
          "Season 1",
          "Episode 1",
          "Rick Grimmes",
          "Glenn Rhee"
        ]
      }
    }
  ]
}

I ran the query db.questions.find({"questions.questionEntry.questionItem.theQuestion" : "q1"}) but this retruned the whole document (both questionEntry's in question array!

I have tried db.questions.find({"questions.questionEntry.questionItem.theQuestion" : "q1"}, _id:0," questions.questionItem": {$elemMatch : {theQuestion: "q1"}}})

But get the following error: Error: error: { "$err" : "Can't canonicalize query: BadValue Cannot use $elemMatch projection on a nested field.", "code" : 17287

Is there a way I could limit the result to just the array element which contains it?

Thanks

Upvotes: 0

Views: 759

Answers (2)

Yathish Manjunath
Yathish Manjunath

Reputation: 2029

db.questions.find({},{"questions.questionEntry.questionItem.theQuestion" : "q1"});

or

db.questions.find({"questions.questionEntry.questionItem.theQuestion" : "q1"},{'questions.$':1});

please try these.

Upvotes: 3

thegreenogre
thegreenogre

Reputation: 1579

If you want to use $elemMatch the query should be:

db.questions.find(
    {"questions.questionEntry.questionItem.theQuestion" : "q1"},
    {
        '_id':0,
        "questions": {
            $elemMatch : {"questionEntry.questionItem.theQuestion": "q1"}
        }
    }
)

Upvotes: 1

Related Questions