Tal vez alguien pueda ayudarme con la canalización de agregación de Mongo. Estoy tratando de poner un objeto en otro objeto, pero soy nuevo en Mongo y es muy difícil:
{ "_id" : ObjectId("5888a74f137ed66828367585"), "name" : "Unis", "tags" : [...], "editable" : true, "token" : "YfFzaoNvWPbvyUmSulXfMPq4a9QgGxN1ElIzAUmSJRX4cN7zCl", "columns" : [...], "description" : "...", "sites" : { "_id" : ObjectId("5888ae2f137ed668fb95a03d"), "url" : "www.....de", "column_values" : [ "University XXX", "XXX", "false" ], "list_id" : ObjectId("5888a74f137ed66828367585") }, "scan" : [ { "_id" : ObjectId("5888b1074e2123c22ae7f4d3"), "site_id" : ObjectId("5888ae2f137ed668fb95a03d"), "scan_group_id" : ObjectId("5888a970a7f75fbd49052ed6"), "date" : ISODate("2017-01-18T16:00:00Z"), "score" : "B", "https" : false, "cookies" : 12 } ] }
Quiero poner cada objeto en la matriz de "escaneo" en "sitios". Para que quede así:
{ "_id" : ObjectId("5888a74f137ed66828367585"), "name" : "Unis", "tags" : [...], "editable" : true, "token" : "YfFzaoNvWPbvyUmSulXfMPq4a9QgGxN1ElIzAUmSJRX4cN7zCl", "columns" : [...], "description" : "...", "sites" : { "_id" : ObjectId("5888ae2f137ed668fb95a03d"), "url" : "www.....de", "column_values" : [ "University XXX", "XXX", "false" ], "list_id" : ObjectId("5888a74f137ed66828367585"), "scan" : [ { "_id" : ObjectId("5888b1074e2123c22ae7f4d3"), "site_id" : ObjectId("5888ae2f137ed668fb95a03d"), "scan_group_id" : ObjectId("5888a970a7f75fbd49052ed6"), "date" : ISODate("2017-01-18T16:00:00Z"), "score" : "B", "https" : false, "cookies" : 12 } ] } }
¿Hay algún paso en la tubería de agregación para realizar esta tarea?
Con una sola tubería, no veo otra forma que especificar cada campo individualmente como:
db.collection.aggregate([ { "$project": { "name": 1, "tags": 1, "editable": 1, "token": 1, "columns": 1, "description": 1, "sites._id": "$sites._id", "sites.url": "$sites.url" , "sites.column_values": "$sites.column_values" , "sites.list_id": "$sites.list_id", "sites.scan": "$scan" } } ])
Con MongoDB 3.4 y versiones posteriores, puede usar el paso de canalización $addFields
en lugar de especificar todos los campos usando $project
. La ventaja es que agrega nuevos campos a los documentos y genera documentos que contienen todos los campos existentes de los documentos de entrada y los campos recién agregados:
db.collection.aggregate([ { "$addFields": { "sites._id": "$sites._id", "sites.url": "$sites.url" , "sites.column_values": "$sites.column_values" , "sites.list_id": "$sites.list_id", "sites.scan": "$scan" } }, { "$project": { "scan": 0 } } ])