MongoDB聚合/查找将数组合并为单独的命名元素

时间:2015-09-08 15:00:45

标签: mongodb aggregation-framework

我有一个包含一系列文档的文档,我需要根据数组记录编号将这些文档合并到一个带有名称的平面文档中。

e.g。

{
'Name': 'Barry'
'Cars': [{
           'Model': 'Clio'
           'Reg':'WY99 XFT'
         }
         {
           'Model': 'Punto'
           'Reg': 'XX01 SDF'
         }]
}

{
'Name': 'Barry'
'Reg1': 'WY99 XFT'
'Reg2': 'XX01 SDF'
}

甚至可以使用Mongoshell和聚合函数吗? 我尝试过$ unwind / $ group的变种,但我似乎无法获得元素编号。 JSON可以有N个汽车。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用 find() 方法迭代集合的 forEach() 光标来创建新对象,转换{{1数组到一个可以添加到展平对象的对象中。通过使用JavaScript本机方法(例如 Object.getOwnPropertyNames() Array.prototype.reduce() ,可以实现转换。以下mongo shell操作演示了这个概念:

Cars

答案 1 :(得分:0)

你基本上可以使用$map

来做到这一点
db.collection.aggregate([
    { "$project": {
        "Name": 1,
        "Regs": { 
            "$map": {
                "input": "$Cars",
                "as": "car",
                "in": "$$car.Reg"
             }
        }
    }}
])

将产生:

{
    "Name": "Barry",
    "Regs": [
        "WY99 XFT",
        "XX01 SDF"
    ]
}

你能做什么"可以"使用聚合框架运算符。

但是不可能给出任意名称"到"键"在你输出的输出中。

所以我建议坚持可能的,或者在代码中做你想做的事情。

答案 2 :(得分:0)

  1.   

    db.so.aggregate([{ “$项目”:{ “_ ID”:0, “名称”:1, “Reg1中”: “$ Cars.Reg”}}])   将生成   {“姓名”:“Barry”,“Reg1”:[“WY99 XFT”,“XX01 SDF”]}

  2.   

    db.so.aggregate([{ “$项目”:{ “_ ID”:0, “名称”:1, “Reg1中”: “$ Cars.Reg”}},{ “$展开”   : “$ Reg1中”}])   会产生   {“姓名”:“Barry”,“Reg1”:“WY99 XFT”}   {“姓名”:“Barry”,“Reg1”:“XX01 SDF”}