MongoDB / Mongoid: Можно ли запросить ObjectID во встроенных документах? - PullRequest
2 голосов
/ 02 января 2011

Для справки, я немного новичок, когда дело доходит до Rails и MongoDB.

Я использую 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 во встроенных документах?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 02 января 2011

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

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

2 голосов
/ 02 января 2011

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

0 голосов
/ 07 сентября 2016

Если вы хотите получить только соответствующий документ, вы можете использовать $ elemMatch с оператором '$', как показано ниже:

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

Он вернет вам только тот соответствующий поддокумент вместо полного поддокумента.

...