我有一个存储在MongoDB中的对象,如下所示:
{
_id: 123
name: "xyz"
attrib:
{
address: "123 xyz rd",
phone: "123-456-7890"
}
}
Run Code Online (Sandbox Code Playgroud)
我想要打破这个结构,所以没有attrib
领域,我只有address
和phone
田地一起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/
从 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)
正如你在这里看到的
归档时间: |
|
查看次数: |
7330 次 |
最近记录: |