在mongoDB中展平嵌套的JSON结构

Vin*_*dey 12 mongodb

我有一个存储在MongoDB中的对象,如下所示:

{
_id: 123
name: "xyz"
    attrib: 
    {
       address: "123 xyz rd",
       phone: "123-456-7890"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要打破这个结构,所以没有attrib领域,我只有addressphone田地一起name_id.

到目前为止,这是我尝试过的:

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

任何人都可以帮助我吗?

llx*_*llx 15

我尝试过这个:

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' 
  }
}
);
Run Code Online (Sandbox Code Playgroud)

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


nim*_*rok 7

从 mongodb 版本 4.2 开始$set,您可以使用和聚合管道进行一次更新$unset

简短且字面的选项是:

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

游乐场 - 文字

通用选项,如果您不想指定所有内部字段,可以是:

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

看看它在操场上的例子是如何工作的

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

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

db.collection.update({},
{
  $rename: {
    "attrib.address": "address",
    "attrib.phone": "phone"
  }
}, {multi: true})
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的

然后:

db.collection.update({}, {$unset: {attrib: ""}}, {multi: true})
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的