2011-01-02 17 views
2

Für den Rekord bin ich ein bisschen ein Neuling, wenn es um Rails und MongoDB geht.MongoDB/Mongoid: Kann man in eingebetteten Dokumenten nach ObjectID fragen?

Ich benutze Rails + Mongoid + MongoDB, um eine App zu erstellen, und mir ist aufgefallen, dass Mongoid aus irgendeinem Grund ObjectID zu eingebetteten Dokumenten hinzufügt.

Gibt es eine Möglichkeit, alle Dokumente in einer Sammlung von ObjectID sowohl die Hauptdokumente als auch die verschachtelten Dokumente abzufragen?

Wenn ich diesen Befehl ausführen

db.programs.findOne({ _id: ObjectId("4d1a035cfa87b171e9000002") }) 

ich diese Ergebnisse zu erhalten, die normal ist, da ich für die ObjectID auf Root-Ebene bin abfragt.

{ 
    "_id" : ObjectId("4d1a035cfa87b171e9000002"), 
    "created_at" : "Tue Dec 28 2010 00:00:00 GMT+0000 (GMT)", 
    "name" : "program", 
    "routines" : [ 
     { 
      "name" : "Day 1", 
      "_id" : ObjectId("4d1a7689fa87b17f50000020") 
     }, 
     { 
      "name" : "Day 2", 
      "_id" : ObjectId("4d1a7695fa87b17f50000022") 
     }, 
     { 
      "name" : "Day 3", 
      "_id" : ObjectId("4d1a76acfa87b17f50000024") 
     }, 
     { 
      "name" : "Day 4", 
      "_id" : ObjectId("4d1a76ecfa87b17f50000026") 
     }, 
     { 
      "name" : "Day 5", 
      "_id" : ObjectId("4d1a7708fa87b17f50000028") 
     }, 
     { 
      "name" : "Day 6", 
      "_id" : ObjectId("4d1a7713fa87b17f5000002a") 
     }, 
     { 
      "name" : "Day 7", 
      "_id" : ObjectId("4d1a7721fa87b17f5000002c") 
     } 
    ], 
    "user_id" : ObjectId("4d190cdbfa87b15c2900000a") 
} 

Nun, wenn ich versuche, mit einem ObjectID mit einem der eingebetteten Dokument (Routinen) Ich mag so null erhalten abzufragen.

db.programs.findOne({ _id: ObjectId("4d1a7689fa87b17f50000020") }) 
null 

Ich kenne eine eingebettete Objekte wie

so abfragen können
db.postings.find({ "author.name" : "joe" }); 

aber das scheint ein wenig überflüssig, wenn Sie eine ObjectID irgendeiner Art übergeben bekommen und wollen in welchem ​​Dokument finden, die wohnt ObjectID.

Also ich denke, meine Frage ist ...

Ist es möglich, mit einigen Methode, die ich nicht kenne, von ObjectID abfragen und die ObjectID des in den eingebetteten Dokumente suchen?

Danke.

Antwort

2

nein, können Sie nur durch das Feld suchen wie { "routines._id" : ObjectId("4d1a7689fa87b17f50000020")}

+0

Ok. Danke für die Information :) –

3

Sie können nicht ObjectIDs global wie die Abfrage. Sie würden

db.programs.find({"routines._id": ObjectId("4d1a7689fa87b17f50000020")})

0

tun Wenn Sie das angepasste Unter Dokument erhalten möchten nur können Sie unter $ elemMatch mit ‚$‘ Operator wie verwenden:

db.programs.find({"_id" : ObjectId("4d1a035cfa87b171e9000002"), 
    routines:{$elemMatch:{"_id" : ObjectId("4d1a7689fa87b17f50000020")}}},{"routines.$":1}) 

Es wird Sie nur zurück das übereinstimmende Unterdokument anstelle des vollständigen Unterdokuments.

Verwandte Themen