Can I use $project to return a field as the top level document in a mongo aggregation query?
Yes, you can use $project
to do that. You just have to tell it to retrieve the nested contents
object using dot notation:
db.items.aggregate( {$project: {contents:'$field1.contents'}} );
Additionally, if you want to to hide the _id
field from the output, you can specify _id: 0
in the $project
parameters:
db.items.aggregate( {$project: {contents:'$field1.contents', _id:0}} );
Starting
Mongo 3.4
, the$replaceRoot
aggregation operator can be used to replace a document by another (in our case by a sub-document):// { field1: { content: { a: 1, b: 2 } }, field2: { othercontent: {} } } // { field1: { content: { c: 1, d: 2 } }, field2: { othercontent: {} } } db.collection.aggregate({ $replaceRoot: { newRoot: "$field1" } }) // { content: { a: 1, b: 2 } } // { content: { c: 1, d: 2 } }
Starting
Mongo 4.2
, the$replaceWith
operator can also be used:db.collection.aggregate({ $replaceWith: "$field1" })