Pregunta

asumir que tengo un modelo BlogPost con cero-a-muchos documentos Comment embebidos. ¿Puedo preguntar para tener rentabilidad y MongoDB solamente objetos Comment emparejan mi especificación consulta?

Por ejemplo, db.blog_posts.find({"comment.submitter": "some_name"}) devuelve sólo una lista de comentarios.

edit: un ejemplo:

import pymongo

connection = pymongo.Connection()
db = connection['dvds']

db['dvds'].insert({'title': "The Hitchhikers Guide to the Galaxy",
                   'episodes': [{'title': "Episode 1", 'desc': "..."},
                                {'title': "Episode 2", 'desc': "..."},
                                {'title': "Episode 3", 'desc': "..."},
                                {'title': "Episode 4", 'desc': "..."},
                                {'title': "Episode 5", 'desc': "..."},
                                {'title': "Episode 6", 'desc': "..."}]})

episode = db['dvds'].find_one({'episodes.title': "Episode 1"}, 
                              fields=['episodes'])

en este ejemplo, episode es:

{u'_id': ObjectId('...'),
 u'episodes': [{u'desc': u'...', u'title': u'Episode 1'},
               {u'desc': u'...', u'title': u'Episode 2'},
               {u'desc': u'...', u'title': u'Episode 3'},
               {u'desc': u'...', u'title': u'Episode 4'},
               {u'desc': u'...', u'title': u'Episode 5'},
               {u'desc': u'...', u'title': u'Episode 6'}]}

Pero sólo quiero:

{u'desc': u'...', u'title': u'Episode 1'}
¿Fue útil?

Solución

Esta misma pregunta se hizo más en la página Mongo DB Grupos de Google. Al parecer no es posible en la actualidad, pero se planea para el futuro.

http://groups.google.com/group/mongodb -user / browse_thread / hilo / 4e6f5a0bac1abccc #

Otros consejos

Creo que lo que quería es la siguiente:

print db.dvds.aggregate([
  {"$unwind": "$episodes"}, # One document per episode
  {"$match": {"episodes.title": "Episode 1"} }, # Selects (filters)
  {"$group": {"_id": "$_id", # Put documents together again
              "episodes": {"$push": "$episodes"},
              "title": {"$first": "$title"} # Just take any title
             }
  },
])["result"]

La salida (además de los espacios en blanco) es:

[ { u'episodes': [ { u'title': u'Episode 1',
                     u'desc': u'...'
                   }
                 ],
    u'_id': ObjectId('51542645a0c6dc4da77a65b6'),
    u'title': u'The Hitchhikers Guide to the Galaxy'
  }
]

Si desea deshacerse de la u"_id", añadir la tubería con:

  {"$project": {"_id": 0,
                "episodes": "$episodes",
                "title": "$title"}
               }

El mongodb javascript shell se documenta en http://docs.mongodb.org/manual / referencia / método /

Si quieres volver únicos campos específicos de un objeto, puede utilizar

db.collection.find( { }, {fieldName:true});

Si, por el contrario, que busca los objetos que contienen un campo específico, puede demandar

db.collection.find( { fieldName : { $exists : true } } );

Partido más simple:

db['dvd'].find_one( {'episodes.title': "Episode 1"},{'episodes.title': true} )

Consulta:

coll.find( criteria, fields );

Obtener campos simplemente específicas del objeto. Ej .:

coll.find( {}, {name:true} );

http://www.mongodb.org/display/DOCS/dbshell+Reference

db.eval :

Usted debe hacer algo como:

episode = connection['dvds'].eval('function(title){
  var t = db.dvds.findOne({"episodes.title" : title},{episodes:true});
  if (!t) return null;
  for (var i in t.episodes) if (t.episodes[i].title == title) return t.episodes[i];
}', "Episode 1");

por lo filtración de episodios estará en un lado del servidor.

También encontré con el mismo problema. La forma en que hago es utilizar la función de agregado. Primero descansar y luego igualar.

db.dvds.aggregate([{$unwind:"$episodes"},{$match:{"episodes.title":"Episode 1"}}])

Los resultados serán como

{ "_id" : ObjectId("5a129c9e6944555b122c8511"),
   "title" : "The Hitchhikers Guide to the Galaxy",
   "episodes" : { "title" : "Episode 1", "desc" : "..." } }

No es perfecto, pero luego se puede editar por pitón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top