mongodb - 如何在分组条件下合并文档并在 mongo 集合中创建新字段?
问题描述
这是 mongo db 集合中的数据迁移。
这是 mongo db 集合中的数据迁移。在下面的代码中,我有一些文件。在 common field1 的基础上,将所有文档分组合并为一个文档。在新的合并文档中,我想要一个新的 field4,它实际上是该组中 field2 和 field3 对象的列表。并且 field2 和 field3 字段不应存在于单个合并文档中。
这样,我的文档数量将在唯一字段 1 的基础上减少集合中。
文档 1 {“field1”:“e8b0f2b5-de4a-4449-b2aa-15f009ac4978”,“field2”:“9911”,“field3”:“a”}
文档 2 {“field1”:“e8b0f2b5-de4a-4449-b2aa-15f009ac4978”,“field2”:“1100”,“field3”:“b”}
文档 3 {“field1”:“e8b0f2b5-de4a-4449-b2aa-15f009ac4978”,“field2”:“0099”,“field3”:“c”}
预期结果
应该是 1 个格式的文档
{
“field1”:“e8b0f2b5-de4a-4449-b2aa-15f009ac4978”,“field4”:[
{
“field2”:“9911”,“field3”:“a”},{
“field2”:“1100”,“场 3":"b" }, {
"场2":"0099", "场3":"c" } ] }
解决方案
您可以使用聚合管道$group
和$push
聚合管道
db.t41.aggregate([
{$group : {
_id : "$field1",
field4 : {$push : {field2 : "$field2", field3 : "$field3"}}
}},
{$project : {_id : 0, field1 : "$_id", field4 : "$field4"}}
]).pretty()
收藏
> db.t41.find()
{ "_id" : ObjectId("5c34260a4ffb628e45e69c00"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "9911", "field3" : "a" }
{ "_id" : ObjectId("5c34260a4ffb628e45e69c01"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "1100", "field3" : "b" }
{ "_id" : ObjectId("5c34260a4ffb628e45e69c02"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "0099", "field3" : "c" }
>
结果
> db.t41.aggregate([{$group : {_id : "$field1", field4 : {$push : {field2 : "$field2", field3 : "$field3"}}}}, {$project : {_id : 0, field1 : "$_id", field4 : "$field4"}}]).pretty()
{
"field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978",
"field4" : [
{
"field2" : "9911",
"field3" : "a"
},
{
"field2" : "1100",
"field3" : "b"
},
{
"field2" : "0099",
"field3" : "c"
}
]
}
>
编辑-1
这无需对密钥进行硬编码即可
db.t41.aggregate([
{$group : { _id : "$field1", data : {$push : {$objectToArray : "$$ROOT"}}}},
{$addFields : {data : {$map : {input : "$data", as : "d", in : {$arrayToObject : {$slice : ["$$d", 2, {$size : "$$d"}]}}}}}}
]).pretty()
聚合管道
> db.t41.aggregate([{$group : { _id : "$field1", data : {$push : {$objectToArray : "$$ROOT"}}}}, {$addFields : {data : {$map : {input : "$data", as : "d", in : {$arrayToObject : {$slice : ["$$d", 2, {$size : "$$d"}]}}}}}}]).pretty()
{
"_id" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978",
"data" : [
{
"field2" : "9911",
"field3" : "a"
},
{
"field2" : "1100",
"field3" : "b"
},
{
"field2" : "0099",
"field3" : "c"
}
]
}
>
推荐阅读
- r - 如何使用 ggplot 绘制 npdensity 对象?
- java - 如何使用 StickerView 撤消和重做功能?
- python - 无法将多线程用于 librosa melspectrogram
- selenium - 我如何在 setupModule 中使用驱动程序初始化
- installation - 如何从 VS 2017 升级到 2019?
- java - 对于以下代码片段,我需要帮助来编写 JUnit 测试用例。任何解决方案或代码提示将不胜感激
- python - 如何在 PyQt5 QTableWidget 中获取选定索引中的项目总和
- python - 如何在 Tensorflow 中显示/可视化卷积和 Relu 后的图像
- java - 一个片段的监听器而不在android中调用片段
- node.js - 在 Hyperledger Fabric 中使用 putState 的值未反映在 couchdb 中