Mongoengine, recuperando solo algo de un MapField

Por ejemplo .. En Mongodb ..

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

El campo ‘mapField’ está hecho de MapField de Mongoengine. y el campo ‘mapField’ tiene un registro de clave y datos … pero solo recuperé ‘BOXFLUX’ ..

esta consulta no funciona en MongoEngine …. por ejemplo …

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

Como puede ver … solo (‘mapField.BOXFLUX’) o solo (‘mapField__BOXFLUX’) no funciona. recupera todos los datos de ‘mapField’, incluido ‘BOXFLUX’ uno ..

¿Cómo puedo recuperar solo un campo de MapField?

Veo que hay una entrada para esto: https://github.com/hmarr/mongoengine/issues/508

Trabaja para mí aquí un ejemplo de caso de prueba:

 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) 

Prueba esto:

 query = BlogPost.objects({your: query}) if name: query = query.only('author__'+name) else: query = query.only('author') 

Como siempre, Ross realmente muchas gracias !!!!!!!!!

Encontré mi culpa … es decir … usé ‘solo’ dos veces ..

Por ejemplo,

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

algo como esto..

Pasé un día entero descubriendo lo que está mal con Mongoengine ..

así que … mi conclusión tonta fue …

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

algo como esto..

pero como saben, es solo un dato sin procesar, no una consulta de mongoengine …

después de este código, no puedo ejecutar ningún método mongoengine …

De todas formas..

En mi caso, debería tener que consultar dependiendo de algunas condiciones.

así que será genial que el método ‘solo’ sobrescriba los métodos ‘solo’ escritos antes … En mi humilde opinión.

Espero que esta característica se integre con la próxima versión.

En este momento, tengo que codificar código duplicado … por ejemplo …

no este código …

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

este código

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

así que … creo que el segundo parece más sucio que el primero.

por supuesto, el primer código muestra todos los datos usando “solo (‘autor’)” no “solo (‘autor__nombre’)

¡¡¡¡¡¡¡¡¡Muchas gracias!!!!!!!!!

Ross, me has salvado !!! Gracias … (Pensé que Mongoengine no podía simplemente hacer esas consultas).