Jason Quinn
Jason Quinn

Reputation: 2563

Is there a query to return multiple results from one document?

I have a document with a structure like -

Doc {
    "DocName": "DocName",
    "Array": [{
        "Name": "Name1",
        "Value": "Value1"
    },{
        "Name": "Name2",
        "Value": "Value2"
    },{
        "Name": "Name3",
        "Value": "Value3"
    }]
}

Is it possible to query Mongo so that it will return multiple documents in a format like the one below?

{
    DocName: "DocName",
    Name: "Name1",
    Value: "Value1"
},
{
    DocName: "DocName",
    Name: "Name2",
    Value: "Value2"
},
{
    DocName: "DocName",
    Name: "Name3",
    Value: "Value3"
}

Upvotes: 3

Views: 1893

Answers (1)

Hugo
Hugo

Reputation: 2913

With mapReduce

Record object:

> db.doc.findOne();
{
  "_id" : ObjectId("4ff5925327064149c3d7a31f"),
  "docname" : "lorem",
  "array" : [
    {
      "name" : "John",
      "value" : "Blond"
    },
    {
      "name" : "Eric",
      "value" : "Brown"
    }
  ]
}

Map function:

map = function () {
  var docname = this.docname;
  this.array.forEach(function (item) {
    emit(item, {'docname': docname});
  });
}

Reduce function:

reduce = function(key, value) {
  return value;
}

Bringing it together:

res = db.doc.mapReduce(map, reduce, { out: 'output' });

The query:

db.output.find();

The result:

{ "_id" : { "name" : "Eric", "value" : "Brown" }, "value" : { "docname" : "lorem" } }
{ "_id" : { "name" : "John", "value" : "Blond" }, "value" : { "docname" : "lorem" } }

It's not exactly what you want but it should get you started.

Upvotes: 4

Related Questions