1

我想去聚合一个有一个记录的mongo集合,里面有一个大的列表,而不是在另一个集合中表示为许多记录。对于记录中不包含在长数组中的变量,这将意味着在复制到新集合时将数组上方的顶层重复到每个新记录中。

我所拥有的是:

> db.current.showOne()
{"name" : "thing",
"othervar" : 1,
"longcollection" : [
                    {"first": 1,
                     "second":2},
                    {"first": 3,
                     "second":4},
                    {"first": 5,
                     "second":6},
                    ... etc...
                    {"first": 10000,
                     "second":10001}
                    ]
}

我想要的是这样的:

> db.new.find().limit(5000).pretty()
{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 1,
                     "second":2}
},
{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 3,
                     "second":4}
},
{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 5,
                     "second":6}
},

{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 7,
                     "second":8}
}

..ETC。

每条记录的唯一信息位于“longcollection”变量中,该变量现在是字典,而不是数组。其他信息,与“longcollection”处于同一级别,而不是在其中,对所有新记录重复。

我认为这是一种展开或放松。将我带到这里的 copyTo() 和 unwrap/aggregation 的语法组合是什么?我在 mongodb 的 javascript 和聚合方面还是个新手。

4

1 回答 1

4

你应该可以用一个简单的$unwind来做到这一点

对于上面的示例,您可以使用:

db.current.aggregate({$unwind: "$longcollection"})

这将为您提供如下结果:

{
    result: : [
        {
            "_id" : ObjectId(...),
            "name": xxxx,
            "othervar": yyyyy,
            "longcollection" : {
                "first": 1, 
                "second":2
            }
        },
        {
            "_id" : ObjectId(...),
            "name": yyyy,
            "othervar": zzzz,
            "longcollection" : {
                "first": 3, 
                "second":4
            }
        }],
        "ok" : 1
}

要停止在评论中看到的重复 _id 消息,您应该能够使用:

db.current.aggregate({$project : {_id: 0, name: 1, othervar: 1, longcollection: 1}}, {$unwind: "$longcollection"})
于 2013-08-12T09:20:20.713 回答