mongo是否提供了解析大型数据集的文档数组的功能?

时间:2015-09-25 17:39:40

标签: mongodb

与map / reduce相似但反过来。 mongo是否有重新格式化数据的方法。我有一个以下格式的集合。

{ 
  {"token-id" : "LKJ8_lkjsd"
    "data": [
               {"views":100, "Date": "2015-01-01"},
               {"views":200, "Date": "2015-01-02"},
               {"views":300, "Date": "2015-01-03"},
               {"views":300, "Date": "2015-01-03"}
            ]
  }
}

我想将整个集合处理成新格式。其中每个时间序列数据点是其文档映射到ID希望使用一些类似于map reduce的固有mongo功能。如果没有;我很欣赏我们可以做到这一点的策略。

{
  { "token-id" : "LKJ8_lkjsd", "views": 100, "Date" : "2015-01-01"},
  { "token-id" : "LKJ8_lkjsd", "views": 200, "Date" : "2015-01-01"},
  { "token-id" : "LKJ8_lkjsd", "views": 300, "Date" : "2015-01-01"}
}

3 个答案:

答案 0 :(得分:3)

您需要汇总管道中的$unwind see mongodb documentation

在您的情况下,代码将是

db.yourcollection.aggregate( [ { $unwind : "$data" } ] )

unwind不会将文档单独插入新集合

您可以使用

> db.test.aggregate( [ { $unwind : "$data" }, {$project: {_id:0, "token-id":1, "data":1}}, {$out: "another"} ] )
> db.another.find()

在第一行中,您需要取消_id,因为在$unwind后您获得了具有相同_id的4个文档(因此无法插入) 如果没有明确的_id,则会自动生成新值

以下是我为您的示例获得的输出

{ "_id" : ObjectId("560599b1699289a5b754fab9"), "token-id" : "LKJ8_lkjsd", "data" : { "views" : 100, "Date" : "2015-01-01" } }
{ "_id" : ObjectId("560599b1699289a5b754faba"), "token-id" : "LKJ8_lkjsd", "data" : { "views" : 200, "Date" : "2015-01-02" } }
{ "_id" : ObjectId("560599b1699289a5b754fabb"), "token-id" : "LKJ8_lkjsd", "data" : { "views" : 300, "Date" : "2015-01-03" } }
{ "_id" : ObjectId("560599b1699289a5b754fabc"), "token-id" : "LKJ8_lkjsd", "data" : { "views" : 300, "Date" : "2015-01-03" } }

答案 1 :(得分:3)

  

aggregate命令可以将结果作为游标返回或存储   产生一个集合,不受大小限制。该   db.collection.aggregate()返回一个游标,可以返回结果集   任何规模的。

 var result = db.test.aggregate( [ { $unwind : "$data" }, {$project: {_id:0, "token-id":1, "data":1}}])

    for(result.hasNext()){
     db.collection.insert(result.next());
    }

答案 2 :(得分:3)

根据您对大数据集的提问,import javax.swing.*; import java.awt.*; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import Main.SqlConnection; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import net.proteanit.sql.DbUtils; import Main.Check; import java.awt.Color; import java.awt.event.KeyEvent; 在这种情况下查询的性能会降低,您应该在聚合中使用 $map 来处理{{1如下所示:

$unwind