Incluye todos los campos existentes y agrega nuevos campos al documento

Me gustaría definir una etapa de agregación $ project en la que pueda indicarle que agregue un nuevo campo e incluya todos los campos existentes, sin tener que enumerar todos los campos existentes.

Mi documento se ve así, con muchos campos:

{ obj: { obj_field1: "hi", obj_field2: "hi2" }, field1: "a", field2: "b", ... field26: "z" } 

Quiero hacer una operación de agregación como esta:

 [ { $project: { custom_field: "$obj.obj_field1", //the next part is that I don't want to do field1: 1, field2: 1, ... field26: 1 } }, ... //group, match, and whatever... ] 

¿Hay algo así como una palabra clave “incluir todos los campos” que pueda usar en este caso, o alguna otra forma de evitar tener que enumerar cada campo por separado?

Partiendo de MongoDB 3.4, podemos usar el operador de canalización de agregación $addFields para hacer esto:

La etapa $addFields es equivalente a una etapa $project que especifica explícitamente todos los campos existentes en los documentos de entrada y agrega los nuevos campos.

 db.collection.aggregate([ { "$addFields": { "custom_field": "$obj.obj_field1" } } ]) 

Puede usar $$ ROOT para hacer referencia al documento raíz. Mantenga todos los campos de este documento en un campo e intente obtenerlo después (dependiendo de su sistema cliente: Java, C ++, …)

  [ { $project: { custom_field: "$obj.obj_field1", document: "$$ROOT" } }, ... //group, match, and whatever... ] 

>>> ¿Hay algo así como la palabra clave “incluir todos los campos” que puedo usar en este caso o alguna otra solución?

Desafortunadamente, no hay operador para “incluir todos los campos” en la operación de agregación. La única razón, porque la agregación se crea principalmente para agrupar / calcular datos de los campos de recostackción (sum, media, etc.) y devolver todos los campos de la colección no es de propósito directo.

A partir de la versión 2.6.4, Mongo DB no tiene esa característica para la canalización de agregación $project . De los documentos para $project :

Pasa a lo largo de los documentos con solo los campos especificados a la siguiente etapa en la tubería. Los campos especificados pueden ser campos existentes de los documentos de entrada o campos recién computados.

y

El campo _id está, por defecto, incluido en los documentos de salida. Para incluir los otros campos de los documentos de entrada en los documentos de salida, debe especificar explícitamente la inclusión en $ project.

según @Deka reply, para c # mongodb driver 2.5 puede obtener el documento agrupado con todas las claves siguientes;

 var group = new BsonDocument { { "_id", "$groupField" }, { "_document", new BsonDocument { { "$first", "$$ROOT" } } } }; ProjectionDefinition projection = new BsonDocument{{ "document", "$_document"}}; var result = await col.Aggregate().Group(group).Project(projection).ToListAsync(); // For demo first record var fistItemAsT = BsonSerializer.Deserialize(result.ToArray()[0]["document"].AsBsonDocument);