在mongoDB中展平嵌套的JSON结构

xxslljrj  于 2023-10-16  发布在  Go
关注(0)|答案(3)|浏览(137)

我有一个存储在MongoDB中的对象,它看起来像:

{
_id: 123
name: "xyz"
    attrib: 
    {
       address: "123 xyz rd",
       phone: "123-456-7890"
    }
}

我想扁平化这个结构,这样就没有attrib字段,我只有addressphone字段沿着name_id
到目前为止,这是我所尝试的:

db.emp.aggregate(
    { 
    $project : {
            { addr : '$review.attrib.address' },
            { phn : '$review.votes.phone' },
        }
    }
);

有人能帮我更进一步吗?

zy1mlcev

zy1mlcev1#

我试过了:

db.abc.insert({
  _id: 123,
  name: "xyz",
  attrib: {
     address: "123 xyz rd",
     phone: "123-456-7890"
  }
});
db.abc.aggregate(
{ 
  $project : {
    _id:1,
    name:1,
    addr : '$attrib.address',
    phn : '$attrib.phone' 
  }
}
);

更多细节,你可以看到:use $project to rename fieldshttp://docs.mongodb.org/manual/reference/aggregation/project/

vxqlmq5t

vxqlmq5t2#

从mongodb 4.2版本开始,您可以使用$set$unset聚合管道的一次更新。
short and literal选项是:

db.collection.update({},
  [
    {$set: {
        address: "$attrib.address",
        phone: "$attrib.phone"
    }},
    {$unset: "attrib"}
  ],
  {multi: true}
)

playground - literal
泛型选项,如果你不想指定所有的内部字段,可以是:

db.collection.update({},
[
  {$replaceRoot: {newRoot: {$mergeObjects: ["$$ROOT", "$attrib"]}}},
  {$unset: "attrib"}
],
{multi: true})

了解它在playground example上的工作原理

对于旧版本,您可以简单地使用$rename/$set$unset

$rename只是$set$unset的组合)

db.collection.update({},
{
  $rename: {
    "attrib.address": "address",
    "attrib.phone": "phone"
  }
}, {multi: true})

你可以看到here
后来:

db.collection.update({}, {$unset: {attrib: ""}}, {multi: true})

你可以看到here

bxgwgixi

bxgwgixi3#

如果你打算改变数据库中的所有文档,那么聚合框架或Map/Reduce都不是好办法。相反,您可以用自己喜欢的语言编写一个脚本,并循环遍历集合中的所有文档,逐个修改它们。

相关问题