【发布时间】:2018-05-09 10:27:12
【问题描述】:
{
"_id" : ObjectId("5ae84dd87f5b72618ba7a669"),
"main_sub" : "MATHS",
"reporting" : [
{
"teacher" : "ABC"
}
],
"subs" : [
{
"sub" : "GEOMETRIC",
"teacher" : "XYZ",
}
]
}
{
"_id" : ObjectId("5ae84dd87f5b72618ba7a669"),
"main_sub" : "SOCIAL SCIENCE",
"reporting" : [
{
"teacher" : "XYZ"
}
],
"subs" : [
{
"sub" : "CIVIL",
"teacher" : "ABC",
}
]
}
我已经简化了我拥有的文档的结构。 基本结构是我有一个父主题,有一组报告老师和一组子主题(每个都有一个老师)
我现在想提取所有主题(父/子主题)以及条件,如果它们是由特定老师教授的子主题。
例如:
对于 ABC 老师,我想要以下结构:
[{'subject':'MATHS', 'is_parent':'True'}, {'subject':'CIVIL', 'is_parent':'FALSE'}]
-- 最有效的查询可能是什么..?我曾尝试使用 $cond 和 $switch 来 $project,但在这两种情况下,我都不得不重复 'subject' 和 'is_parent' 的条件语句
-- 是否建议在查询中进行计算,或者我应该获取数据转储然后修改服务器代码中的结构?如,我可以 $unwind 并获取父主题与每个子主题的映射,然后执行 for 循环。
我试过了
db.collection.aggregate(
{$unwind:'$reporting'},
{$project:{
'result':{$cond:[
{$eq:['ABC', '$reporting.teacher']},
"$main_sub",
"$subs.sub"]}
}}
)
然后我意识到,即使我将 else 部分转换为子主题的另一个查询,我也必须为 is_parent 的属性编写完全相同的内容
【问题讨论】:
-
@NeilLunn:您所说的有限文档是我写“简化文档”时的意思。很抱歉造成混乱。
-
@NeilLunn :另外,无论我尝试过什么都没有取得任何成功,因此这里没有代码。我不知道如何在一个查询中获取结果结构。
-
当然没有。描述成功解决问题的问题是题外话。当然,你需要放松,至少要分组。展示你最明智的尝试,以便人们指出你做错了什么。
-
@AlexBlex:
db.collection.aggregate({$unwind:'$reporting'},{$project:{'result':{$cond:[{$eq:['ABC', '$reporting.teacher']}, "$main_sub", "$subs.sub"]}}})这就是我要做的,然后我意识到,即使我将 else 部分转换为子主题的另一个查询,我也必须为is_parent 的属性 -
@BhumiSinghal,强烈建议作者使用要求的详细信息更新问题,而不是将其放入 cmets。我为你做的,请确保你下次自己做。
标签: mongodb projection