I have a document similar to the following, where I want to return a field of the current top level documents as the top level document itself in the results array:
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" })
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}} );