将根字段嵌入聚合管道中的子文档中

时间:2017-01-25 15:16:34

标签: mongodb mongodb-query aggregation-framework

也许有人可以帮我处理Mongo的聚合管道。我试图将一个对象放在另一个对象中,但我是Mongo的新手,并且非常困难:

{
    "_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
            }
    ]
}

我想将“scan”中的每个对象 - 阵列放入“网站”中。所以它看起来像这样:

{
    "_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
            }
        ]
    }
}

聚合管道中是否有执行此任务的步骤?

1 个答案:

答案 0 :(得分:1)

使用单个管道我不会看到任何其他方式,但是将每个字段分别指定为:

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"
        }
    }
])

使用MongoDB 3.4及更新版本,您可以使用 $addFields 管道步骤,而不是使用 $project 指定所有字段。优点是它向文档添加了新字段,并输出了包含输入文档和新添加字段中所有现有字段的文档:

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 } }
])