2012-05-21 2 views
2

Для примера .. В MongoDB ..Mongoengine, retriving лишь некоторые из MapField

> db.test.findOne({}, {'mapField.FREE':1}) 
{ 
    "_id" : ObjectId("4fb7b248c450190a2000006a"), 
    "mapField" : { 
      "BOXFLUX" : { 
        "a" : "f", 
      } 
    } 
} 

Поле '' mapField изготовлен из MapField из Mongoengine. и поле «mapField» имеет журнал ключа и данных .. но я просто извлекаться только «BOXFLUX» ..

этот запрос не работает в MongoEngine .... , например ..

BoxfluxDocument.objects(~~ querying ~~).only('mapField.BOXFLUX') 

AS вы можете увидеть .. только ('mapField.BOXFLUX') или только только ('mapField__BOXFLUX') не работает. он извлекает все данные «mapField», в том числе «BOXFLUX» один.

Как я могу получить только поле MapField ???

ответ

5

Я вижу, что билет на это: https://github.com/hmarr/mongoengine/issues/508

Работы для меня Вот пример теста:

def test_only_with_mapfields(self): 

    class BlogPost(Document): 
     content = StringField() 
     author = MapField(field=StringField()) 

    BlogPost.drop_collection() 

    post = BlogPost(content='Had a good coffee today...', 
        author={'name': "Ross", "age": "20"}).save() 

    obj = BlogPost.objects.only('author__name',).get() 

    self.assertEquals(obj.author['name'], "Ross") 
    self.assertEquals(obj.author.get("age", None), None) 
1

Как всегда, Росс Действительно спасибо !!!!!!! !!

Я нашел ошибку .. это .. Я использовал 'только' два раза ..

Например,

BlogPost.objects.only('author').only('author__name') 

что-то вроде этого ..

Я провел целый день выяснить, что случилось с Mongoengine ..

так .. мой немой вывод был ...

BlogPost.objects()._collection.find_one(~~ filtering query ~~, {'author.'+ name:1}) 

что-то вроде этого ..

но, как вы знаете, это просто необработанные данные не mongoengine запрос ..

после этого кода, я не могу запускать любые методы mongoengine ...

Во всяком случае ..

В моем случае, я должен был бы запросить в зависимости от некоторых условий.

так что будет здорово, что метод «только» перезаписывает «только» методы, написанные до этого. По моему скромному мнению.

Я надеюсь, что эта функция будет интегрирована с следующей версией ..

Прямо сейчас, я должен закодировать повторяющийся код .. например ..

не этот код ...

query = BlogPost.objects() 
query(query~~).only('author') 
if name: 
    query = query.only('author__'+name) 

этот код

query = BlogPost.objects() 
query(query~~).only('author') 
if name: 
    query = BlogPost.objects().only('author__'+name) 

так .. я думаю .. второй выглядит грязнее, чем первый.

конечно, первый код показывает все все данные с помощью «только („автор“)» не «только („“) author__name

Большое спасибо !!!!!!!!!

Росс, ты спас меня !!! Спасибо .. (я думал Mongoengine не мог просто сделать эти запросы.)

3

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

query = BlogPost.objects({your: query}) 
if name: 
    query = query.only('author__'+name) 
else: 
    query = query.only('author') 
Смежные вопросы