【问题标题】:Project values of different columns into one field将不同列的值投影到一个字段中
【发布时间】: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


【解决方案1】:

您有 2 个数组,因此您需要展开这两个数组 - reportingsubs

在该阶段之后,每个文档将最多有 1 个父教师-主体和最多 1 个子教师-主体对。

您需要再次展开它们以使每个文档有一个教师主题,这是您定义它是否为父对象的地方。

然后你可以按老师分组。不需要 $conds、$filters 或 $facets。例如:

db.collection.aggregate([
    { $unwind: "$reporting" },
    { $unwind: "$subs" },
    { $project: {
        teachers: [ 
            { teacher: "$reporting.teacher", sub: "$main_sub", is_parent: true }, 
            { teacher: "$subs.teacher", sub: "$subs.sub", is_parent: false }
        ]
    } },
    { $unwind: "$teachers" },
    { $group: {
        _id: "$teachers.teacher",
        subs: { $push: {
            subject: "$teachers.sub", 
            is_parent: "$teachers.is_parent"
        } }
    } }
])

【讨论】:

  • 我不知道我们可以在 $project 中为每个文档形成数组。有趣的发现。我可能会通过在 $unwind 之前和 $project 之后添加一个 $match 来改进这一点,以便根据需要在教师 = XYZ 的地方工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2015-12-19
相关资源
最近更新 更多