【发布时间】:2017-10-31 14:39:38
【问题描述】:
我有一个现有的深度嵌套的 mongoDB 模式,我必须将其展平,因为我有一个复杂的查询,无法使用当前结构有效地进行。这是架构的 MWE:
db.test.insert({
"_id" : ObjectId("58e574a768afb6085ec3a388"),
"details" : [
{
"_id" : ObjectId("58e55f0f68afb6085ec3a2cc"),
"a" : [
{
"unit" : "08",
"size" : "5",
"pos" : "Far",
"_id" : ObjectId("58e55f0f68afb6085ec3a2d0")
}
],
"b" : [
{
"unit" : "08",
"size" : "5",
"pos" : "Far",
"_id" : ObjectId("58e55f0f68afb6085ec3a2cd")
}
],
"c" : [
{
"unit" : "08",
"size" : "3",
"pos" : "Far",
"_id" : ObjectId("58e55f0f68afb6085ec3a2ce")
}
],
"d" : [
{
"unit" : "08",
"size" : "5",
"pos" : "Far",
"_id" : ObjectId("58e55f0f68afb6085ec3a2cf")
}
]
}
]
})
我想展平架构。想要的结果是这样的:
"_id" : ObjectId("58e574a768afb6085ec3a388"),
"tests" : [
{
"_id" : ObjectId("58e542fb68afb6085ec3a1d2"),
"aUnit" : "08",
"aSize" : "5",
"aPos" : "Far",
"bPos" : "Far",
"bSize" : "5",
"bUnit" : "08",
"cPos" : "Far",
"cSize" : "3",
"cUnit" : "08",
"dPos" : "Far",
"dSize" : "5",
"dUnit" : "08"
}
]
我愿意一次一个地输入每种条目类型,我认为我有一种方法可以做到这一点,但它不起作用。这是我尝试过的:
db.test.find({"tests.$.details.a.unit":{$exists:true}}).forEach(function(doc) {
doc.tests = {aUnit:tests.details.a.unit};
delete tests.details.a.unit;
db.test.save(doc);
});
但是,这并没有改变。如何改进我的查询以扁平化我的架构?
已编辑:我意识到 MWE 与我打算使用它的那个相比有一个小错误。我正在关闭每个条目。例如,"a" : [{ ... }], 被错误地写为{"a" : [{ ... }]},。但是,它现在已更新。
【问题讨论】:
-
您是否尝试过属于聚合框架的
$project$group和$unwind函数? -
您是在尝试将数据“更新”到您的新表单中,还是仅仅作为查询返回一个看起来像您的新表单的结果?