2011-01-02 3 views
2

Для записи я немного новичок, когда речь заходит о Rails и MongoDB.MongoDB/Mongoid: Можно ли запросить ObjectID во встроенных документах?

Я использую Rails + Mongoid + MongoDB для создания приложения, и я заметил, что Mongoid по какой-то причине добавляет ObjectID во встроенные документы.

Есть ли способ запросить все документы в коллекции по ObjectID как основным документам, так и вложенным?

Если я запускаю эту команду

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

я получаю эти результаты, это нормально, так как я запрашивая для ObjectID на корневом уровне.

{ 
    "_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") 
} 

Теперь, если я пытаюсь запросить с ObjectID с одним из встроенных документов (процедур) я получаю нулевой, как это.

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

Я знаю, что один может запрашивать встроенные объекты, как так

db.postings.find({ "author.name" : "joe" }); 

, но это кажется немного излишним, если вы прошли в ObjectID какой-то и хотите найти, в каком документе, который ObjectId проживает.

Так что я думаю, мой вопрос заключается в следующем ...

Можно ли, с каким-то способом, я не знаком с, запрос по ObjectID и поиск ObjectId находится в внедренных документах?

Спасибо.

ответ

2

нет, вы можете осуществить поиск только по полю, как { "routines._id" : ObjectId("4d1a7689fa87b17f50000020")}

+0

Хорошо. Спасибо за информацию :) –

3

Вы не можете запросить ObjectIds глобально, как это. Вы должны сделать

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

0

Если вы хотите, чтобы получить согласованный суб-документ только вы можете использовать $ elemMatch с «$» оператор, как показано ниже:

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

Это вернет вас только который соответствует суб-документу вместо полного поддокумента.

Смежные вопросы