Donato
Donato

Reputation: 2777

get all embedded documents in collection

I have contact documents which contain an embedded document "lead". So the data would look like this:

{ 
    "_id" : ObjectId("54f8fa496d6163ad64010000"),
    "name" : "teretyrrtuyytiuyi",
    "email" : "[email protected]", 
    "fax" : "",
    "birth_date" : null, 
    "phone" : "dfgdfhfgjg",
    "phone_2" :
    "hgjhkhjkljlj",
    "lead" : { "_id" : ObjectId("54f8fa496d6163ad64020000"), "appointment status" : "dfhgfgjghjk" }
}

When there are many contacts, there will be many leads. I want to retrieve all the leads in the collection, without retrieving the owning contact. I tried the following but none seem to work:

db.lead.find()
db.contacts.find({ 'lead.$' : 1})

Any way to do this?

Upvotes: 2

Views: 1980

Answers (1)

mnemosyn
mnemosyn

Reputation: 46291

If that query makes sense for you, you should have probably used a different data structure. If your embedded document has an id, it is almost certainly supposed to be a first-level citizen instead.

You can work around this using the aggregation framework, but I'd consider that a hack that probably works around some more profound problem with your data model.

It's also not very elegant:

>
> db.contacts.aggregate({ $project : { 
      "appointment_status" : "$lead."appointment_status", 
      "lead_id" : "$lead.id", ... } });
>

That way, it'll look as if leads was a collection of its own, but it's not and this is just a bad hack around it.

Note that there's no wildcard operator, so if you want to have all fields projected to the root level, you'll have to do it manually. It'd be much easier to simply read the regular documents - if that's not what you need, correct your schema design.

Upvotes: 2

Related Questions