2013-11-01 7 views
4

Если предположить, что это один элемент из моей базе данных:PyMongo найти по _id в поддокументами

{"_id" : ObjectID("526fdde0ef501a7b0a51270e"), 
    "info": "foo", 
    "status": true, 
    "subitems : [ {"subitem_id" : ObjectID("65sfdde0ef501a7b0a51e270"), 
       //more}, 
       {....} 
       ], 
    //more 
} 

Я хочу найти (или find_one, не имеет значения) документ (ы) с "subitems.subitem_id" : xxx.

Я пробовал следующее. Все они возвращают пустой список.

from pymongo import MongoClient,errors 
from bson.objectid import ObjectId 

id = '65sfdde0ef501a7b0a51e270' 

db.col.find({"subitems.subitem_id" : id }) #obviously wrong 
db.col.find({"subitems.subitem_id" : Objectid(id) }) 
db.col.find({"subitems.subitem_id" : {"$oid":id} }) 
db.col.find({"subitems.subitem_id.$oid" : id }) 
db.col.find({"subitems.$.subitem_id" : Objectid(id) }) 

В mongoshell это работает, однако:

find({"subitems.subitem_id" : { "$oid" : "65sfdde0ef501a7b0a51e270" } }) 

ответ

2

перепроверили. Правильный ответ: db.col.find({"subitems.subitem_id" : Objectid(id)}) Имейте в виду, что этот запрос вернет полную запись, а не только соответствующую часть подматрицы.

Монго оболочка:

a = ObjectId("5273e7d989800e7f4959526a") 
db.m.insert({"subitems": [{"subitem_id":a}, 
          {"subitem_id":ObjectId()}]}) 
db.m.insert({"subitems": [{"subitem_id":ObjectId()}, 
          {"subitem_id":ObjectId()}]}) 
db.m.find({"subitems.subitem_id" : a }) 

>>> { "_id" : ObjectId("5273e8e189800e7f4959526d"), 
"subitems" : 
[ 
{"subitem_id" : ObjectId("5273e7d989800e7f4959526a") },  
{"subitem_id" : ObjectId("5273e8e189800e7f4959526c")} 
]} 
+0

Качество ответов значительно улучшается при предоставлении дополнительных пояснений. –

+1

Улучшенные и добавленные примеры. – nickzam

+0

Обратите внимание на типографские ошибки в этом ответе и на вопрос. Если вы видите Objectid или ObjectID, он должен прочитать ObjectId. Заглавная буква I и буквенное обозначение d. И в JavaScript, и в Python. – Rafa

3

Буквальный 65sfdde0ef501a7b0a51e270 не шестнадцатеричный, следовательно, не является допустимым ObjectId.

Также, id - это встроенная функция Python. Избегайте его перепродажи.

Наконец, вы выполняете поиск, но не оцениваете его, чтобы не видеть никаких результатов. Помните, что курсоры пимонго ленивы.

Попробуйте это.

from pymongo import MongoClient 
from bson.objectid import ObjectId 

db = MongoClient().database 
oid = '65cfdde0ef501a7b0a51e270' 

x = db.col.find({"subitems.subitem_id" : ObjectId(oid)}) 

print list(x) 

Уведомление: Я скорректировал oid на допустимую шестнадцатеричную строку.

Тот же запрос в оболочке Mongo JavaScript.

db.col.find({"subitems.subitem_id" : new ObjectId("65cfdde0ef501a7b0a51e270")}) 
+0

Существует большая разница между id и id(). Я не вижу никаких проблем. Укажите id = 5' – nickzam

+0

Если вы делаете 'id = 5', встроенный' id() 'эффективно скрывается в этой области. См. Http://stackoverflow.com/questions/77552. – Rafa

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