1
[{
        "field1" : "1",
        "field2" : [ 
            {
                "f1" : "a",
                "f2" : "b"
            }, 
            {
                "f1" : "aa",
                "f2" : "bb"
            }
        ]
},

{
        "field1" : "2",
        "field2" : [ 
            {
                "f1" : "c",
                "f2" : "d"
            }, 
            {
                "f1" : "cc",
                "f2" : "dd"
            }
        ]
    }]

我想找出字段 2 并将它们合并到文档中,格式如下:

    {
        "f1" : "a",
        "f2" : "b"
    }, 
    {
        "f1" : "aa",
        "f2" : "bb"
    },
    {
        "f1" : "c",
        "f2" : "d"
    }, 
    {
        "f1" : "cc",
        "f2" : "dd"
    }
4

4 回答 4

1

对于输入数据:

[
{
    "field1" : "1",
    "field2" : [ 
        {
            "f1" : "a",
            "f2" : "b"
        }, 
        {
            "f1" : "aa",
            "f2" : "bb"
        }
    ]
}
,
{
    "field1" : "2",
    "field2" : [ 
        {
            "f1" : "c",
            "f2" : "d"
        }, 
        {
            "f1" : "cc",
            "f2" : "dd"
        }
    ]
}
]

使用聚合:

[
  {
    "$unwind": "$field2"
  },
  {
    "$group": {
      "_id": "$field2"
    }
  },
   {
     "$replaceRoot": { "newRoot": "$_id" }
   }
]

生产:

[
  {
    "f1": "c",
    "f2": "d"
  },
  {
    "f1": "cc",
    "f2": "dd"
  },
  {
    "f1": "aa",
    "f2": "bb"
  },
  {
    "f1": "a",
    "f2": "b"
  }
]

你可以在 mongoDB 操场上玩这个:这里

于 2019-03-15T09:19:58.277 回答
0

let fakeArray = [
                    {
                        "field1" : "1",
                        "field2" : [ 
                            {
                                "f1" : "a",
                                "f2" : "b"
                            }, 
                            {
                                "f1" : "aa",
                                "f2" : "bb"
                            }
                        ]
                    },
                    {
                        "field1" : "2",
                        "field2" : [ 
                            {
                                "f1" : "c",
                                "f2" : "d"
                            }, 
                            {
                                "f1" : "cc",
                                "f2" : "dd"
                            }
                        ]
                    }
                ];

                let arr = fakeArray.map(el => {
                    return el.field2;
                });

                console.log(arr.flat(1));

您可以轻松使用地图平面等js功能

于 2019-03-15T09:22:03.887 回答
0

您可以尝试在聚合查询中使用 a$unwind和 a :$project

db.test.insertMany([
    { "field1" : "1", "field2" : [ { "f1" : "a", "f2" : "b" }, { "f1" : "aa", "f2" : "bb" } ] },
    { "field1" : "2", "field2" : [ { "f1" : "c", "f2" : "d" }, { "f1" : "cc", "f2" : "dd" } ] }
]);

db.test.aggregate([
    {$unwind: "$field2"},
    {$project: {
        "f1": "$field2.f1",
        "f2": "$field2.f2"
    }}
]);

这将为您提供以下输出:

{ "_id" : ObjectId("5c8b70474c52159bf9357567"), "f1" : "a", "f2" : "b" }
{ "_id" : ObjectId("5c8b70474c52159bf9357567"), "f1" : "aa", "f2" : "bb" }
{ "_id" : ObjectId("5c8b70474c52159bf9357568"), "f1" : "c", "f2" : "d" }
{ "_id" : ObjectId("5c8b70474c52159bf9357568"), "f1" : "cc", "f2" : "dd" }

https://play.db-ai.co/m/XItxEAgjhgAB8iV6

于 2019-03-15T09:30:34.270 回答
0

我认为没有必要group。只是unwindreplaceRoot

db.collection.aggregate([
{"$unwind": "$field2"},
{"$replaceRoot": { "newRoot": "$field2" }}
])
于 2019-03-15T09:42:35.227 回答