重塑未知的mongoDB架构

重塑未知的mongoDB架构,mongodb,Mongodb,假设我必须处理一个MongoDB数据库,而我对它的模式一无所知 使用聚合管道是否可以在对中重塑架构 例如,假设这是您的bios集合的文档: "_id" : 3, "name" : { "first" : "Grace", "last" : "Hopper" }, "title" : "Hello World", "birth" : ISODate("1906-12-09T05:00:00.000Z"), "death" : ISODate("1992-01

假设我必须处理一个MongoDB数据库,而我对它的模式一无所知
使用聚合管道是否可以在
对中重塑架构

例如,假设这是您的
bios
集合的文档:

"_id" : 3,
"name" : {
        "first" : "Grace",
        "last" : "Hopper"
    },
"title" : "Hello World",
"birth" : ISODate("1906-12-09T05:00:00.000Z"),
"death" : ISODate("1992-01-01T05:00:00.000Z")
我想重塑我的架构以获得:

{
    "_id" : ObjectId("56d420d6d4360d06e1bc5b64"),
    "document" : [ 
        {
            "_id" : "_id",
            "value" : 3
        }, 
        {
            "_id" : "name",
            "value" : [ 
                {
                    "_id" : "first",
                    "value" : "Grace"
                }, 
                {
                    "_id" : "last",
                    "value" : "Hopper"
                }
            ]
        }, 
        {
            "_id" : "title",
            "value" : "Hello World"
        }, 
        {
            "_id" : "birth",
            "value" : ISODate("1906-12-09T05:00:00.000Z")
        }, 
        {
            "_id" : "death",
            "value" : ISODate("1992-01-01T05:00:00.000Z")
        }
    ]
}

请记住,我不知道哪个是MongoDB文档的模式。

这个转换可以通过使用聚合框架来完成。 由于输入文档具有稳定的结构,您可以使用 指挥部。 MongoDb文档是无模式的所谓动态模式,因此您可以根据需要对其进行塑造

到项目字段-只需根据需要键入此字段-到项目数据添加cashSign$,这样“name”将生成字段名,但“$name”将从输入文档中推送“name”值

请在下面找到一个示例:

    db.collection.aggregate( [ { 
        $project: { 
        "_id":"$_id",   
        document: [ {
                "_id" : "_id",
                "value" : "$_id"},
                {
                "_id" : "name",
                "value" : [ 
                    {
                        "_id" : "first",
                        "value" : "$first"
                    }, 
                    {
                        "_id" : "last",
                        "value" : "$last"
                    }
        ]}]
        }
        }]) 

好的,但我不知道每个字段的名称。所以我不知道每个
\u id
项目的值是多少。例如,我不知道在我的模式中有一个名为name的字段,name.first ecc…你有权访问mongo实例来检查吗?我有权访问mongo实例。那么你能查询它吗?db.\u collectionName.\u.findOne().pretty()我可以。但是mongo,正如你所说,是无模式的,所以对于findOne,我不能保证找到所有字段。我可以用findOne做什么?你目前只能用map reduce做这件事,有一个在聚合中做这件事的功能请求,但它还没有实现。你好,Asya Kamsky。谢谢你的回答。我还有一个问题要问你:我必须从一个未知的模式
对中检索。我在这项工作中使用了map/reduce递归函数。您知道是否可以通过聚合来实现这一点吗?如下面的答案所示,如果您事先知道密钥名称,那么您就可以实现这一点。如果你不知道,那么你就不能再次感谢你的耐心。