TripVoltage
TripVoltage

Reputation: 341

mongo searching more than 1 collection for same criteria

I have a mongo DB with several collections that contain JSON document formats shown below:

{
  "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'm able to search for questions.questionEntry.questionItem.theQuestion for a matching criteria with:

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

This works well for the questions collection but how would I do the same search across multiple collections?

Many thanks

Upvotes: 0

Views: 69

Answers (2)

chridam
chridam

Reputation: 103305

To use the same query across multiple collections you may have to use the JavaScript bracket notation to access the collections in a loop. For example, the following queries the records database for all the collections (using the db.getCollectionNames() command) with the specified query:

use records
var colls = db.getCollectionNames(), // get all the collections in records db
    query = {"questions.questionEntry.questionItem.theQuestion" : "q1"},
    projection = {"questions.$": 1};
colls.forEach(function (collection){    
    var docs = db[collection].find(query, projection).toArray(); // use the bracket notation
    docs.forEach(function (doc){ printjson(doc); });
})

Upvotes: 1

mp911de
mp911de

Reputation: 18119

You will have to do this by yourself. There is no out-of-the-box support.

You can query MongoDB multi-threaded (depending on your programming language) and aggregate the results to a unified result.

Upvotes: 0

Related Questions