¿Cómo puedo cambiar el nombre de los campos cuando se realiza la búsqueda/proyección en MongoDB?

Es posible cambiar el nombre del nombre de los campos devueltos en una consulta de búsqueda? Me gustaría usar algo como $rename, sin embargo no me gustaría cambiar los documentos, yo estoy acceso. Quiero sólo para recuperar de manera diferente, algo que funciona como SELECT COORINATES AS COORDS en SQL.

Lo que voy a hacer ahora:

db.tweets.findOne({}, {'level1.level2.coordinates': 1, _id:0})
{'level1': {'level2': {'coordinates': [10, 20]}}}

Lo que me gustaría ser devuelto es:
{'coords': [10, 20]}

InformationsquelleAutor themiurgo | 2014-05-21

2 Kommentare

  1. 46

    Así que, básicamente, el uso de .aggregate() en lugar de .find():

    db.tweets.aggregate([
        { "$project": {
            "_id": 0,
            "coords": "$level1.level2.coordinates"
        }}
    ])

    Y que le da el resultado que usted desea.

    MongoDB 2.6 y versiones anteriores devuelven un «cursor» como encontrar lo hace.

    Ver $proyecto y otros marco de agregación de los operadores para obtener más detalles.


    Para la mayoría de los casos usted debe simplemente cambiar el nombre de los campos devueltos de .find() al procesar el cursor. Para JavaScript como un ejemplo, usted puede utilizar .mapa() para ello.

    Desde el shell:

    db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
      doc.coords = doc['level1']['level2'].coordinates;
      delete doc['level1'];
      return doc;
    })

    O más en línea:

    db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => 
      ({ coords: doc['level1']['level2'].coordinates })
    )

    Esta forma se evita cualquier sobrecarga adicional en el servidor y debe ser utilizado en casos en los que el procesamiento adicional sobrecarga pesarían más que la ganancia real de la reducción en el tamaño de los datos recuperados. En este caso ( y más ) que sería mínimo y por lo tanto mejor para volver a procesar el cursor resultado de reestructuración.

  2. 3

    Como lo menciona @Neil Lunn esto puede lograrse con una agregación de canalización:

    Y a partir Mongo 4.2, el $replaceWith operador de agregación pueden ser utilizados para reemplazar un documento por parte de un sub-documento:

    //{ level1: { level2: { coordinates: [10, 20] }, b: 4 }, a: 3 }
    db.collection.aggregate(
      { $replaceWith: { coords: "$level1.level2.coordinates" } }
    )
    //{ "coords" : [ 10, 20 ] }

    Ya que usted menciona findOne, también puede limitar el número de documentos generados a 1 como tal:

    db.collection.aggregate([
      { $replaceWith: { coords: "$level1.level2.coordinates" } },
      { $limit: 1 }
    ])

    Antes de Mongo 4.2 y a partir Mongo 3.4, $replaceRoot puede ser utilizado en lugar de $replaceWith:

    db.collection.aggregate(
      { $replaceRoot: { newRoot: { coords: "$level1.level2.coordinates" } } }
    )

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...