javascript - 如何将异构数组合并到 MongoDb 中的单个文档?

标签 javascript python mongodb

我网站的 MongoDb 为每个用户存储一个文档。每个用户在访问期间都会回答几份问卷。表单存储在一个数组中,但由于文档不重叠,所以一个平面的单个文档就足够了。为了进行分析,我希望生成一个包含所有表格的所有答案的平面表格。

考虑以下数据结构:

{
    "USER_SESSION_ID": 456,
    "forms": [
        {
            "age": 21,
            "gender": "m"
        },
        {
            "job": "Student",
            "years_on_job": "12"
        },
        {
            "Hobby": "Hiking",
            "Twitter": "@my_account"
        }
    ]
},
{
    "USER_SESSION_ID": 678,
    "forms": [
        {
            "age": 46,
            "gender": "f"
        },
        {
            "job": "Bodyguard",
            "years_on_job": "2"
        },
        {
            "Hobby": "Skiing",
            "Twitter": "@bodyguard"
        }
    ]
}

表单文档看起来都不一样,没有冲突的字段,所以我想合并它们,产生一个表格的、扁平的结构,如下所示:

{ 'USER_SESSION_ID': 456, 'age': 21, 'gender': 'm', 'job': 'Student', ... 'Twitter': '@my_account' }
{ 'USER_SESSION_ID': 678, 'age': 46, 'gender': 'f', 'job': 'Bodyguard',  ... 'Twitter': '@bodyguard' }

使用 Python,这很简单,看起来像这样:

for session in sessions:          # Iterate all docs
    for form in session['forms']: # Iterate all children
        session.update(form)      # Integrate to parent doc
    del session['forms']          # Remove nested child

在 MongoDb 中,我发现这很难实现。我正在尝试使用聚合管道,我认为它应该适用于此。

到目前为止,我通过展开我的数据结构来帮助自己,就像这样:

db.sessions.aggregate(
    {
        '$unwind': '$forms'
    },
    { 
        '$project': {
            'USER_SESSION_ID': true,
            'forms': true
        }
    },
    {
        '$group': {
            '_id': '$USER_SESSION_ID',
            'forms': <magic?!>
        }
    }
)

在展开阶段,我为每个 child 创建一个包含 parent 数据的文档。这应该大致相当于我的 python 代码中的双循环。但是,我觉得我在概念上缺少的是分组时的“合并”累加器。在 python 中,这是通过 dict.update() 完成的,在 underscore.js 中,它将是 _.extend(destination, *sources)

我如何在 MongoDB 中实现这一点?

最佳答案

尝试以下使用嵌套的 forEach() find() 的方法调用使用 cursor 遍历游标结果并获取 forms 数组中元素的对象键 Object.keys() :

db.sessions.find().forEach(function (doc){
    doc.forms.forEach(function (e){ 
        var keys = Object.keys(e); 
        keys.forEach(function(key){ doc[key] = e[key] });
    });
    delete doc.forms;
    db.sessions.save(doc);
});

关于javascript - 如何将异构数组合并到 MongoDb 中的单个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30436572/

相关文章:

python - 如何用堆叠在 numpy 数组中的一组图像制作电影?

javascript - 如何创建使用node和mongodb发送邮件的api

c# - 如何模拟 IMongoDatabase

javascript - 鼠标移动时如何使图像变色?

javascript - Ionic Controller 使用参数在 $state.go 上重新加载

javascript - 为什么我的 Jquery Slide div 总是显示在开头

python - 如何遍历 df 的每一行/列以查看是否存在 0 或 ' '?

javascript - 使用 iframe 构建的 Access Dom

python - HDF5 数据集数量限制

javascript - 使用 javascript/node.js 在 mongodb 中查找具有另一个条件的对象的最早日期