8

I am fairly new to mongodb, and I have what is hopefully a simple question:

I have a nested schema where I have a field that is an array, where each item of that array is an object that itself has an array field.

For example:

> db.mytest.insert({
    name: 'a',
    top: [
      {x:1, y:2, nest: [{p:1, q:2}, {p:2, q:3}]},
      {x:2, y:3, nest: [{p:4, q:5}, {p:6, q:7}]}
    ]
  })

I can query for certain values of p just fine, and can even limit my result to the first matching element of top:

> db.mytest.findOne({'top.nest': {$elemMatch: {p:6}}}, {'top.nest.$': 1})
{"_id":ObjectId(...), top: [{x:2, y: 3, nest: [{p:4, q:5}, {p:6, q:7}]}]}

Which brings me to my question: {'top.nest.$': 1} and {'top.$': 1} as my projection document both return the same result. How can I limit my search results to only include the first matching element of nest?

Do I need a second pass that iterates over the result of this style of query?

1 Answer 1

8

Ok, the trick was the aggregation framework, specifically unwind.

> db.mytest.aggregate({$unwind: '$top'},
                      {$unwind: '$top.nest'},
                      {$match: {'top.nest.p': 6}}
  )

Though in the case that I had multiple sub matches in a single object, this would return multiple results instead of in their original grouped form. I suppose I can put a $group into the pipeline, though.

Though the related links I found suggested schema redesign as the only complete fix right now, so this is definitely better than nothing.

Sign up to request clarification or add additional context in comments.

Comments

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.