2015-07-20 45 views
1

我的测试集MongoDB的数据转换

{ "_id" : 0, "Animals" : "cat", "activity" : "sleep" } 
{ "_id" : 1, "Animals" : "dog", "activity" : "run" } 
{ "_id" : 2, "Animals" : "cow", "activity" : "play" } 
{ "_id" : 3, "Animals" : "cow", "activity" : "sleep" } 
{ "_id" : 4, "Animals" : "cow", "activity" : "run" } 
{ "_id" : 5, "Animals" : "dog", "activity" : "play" } 
{ "_id" : 6, "Animals" : "cat", "activity" : "run" } 

动物后发现动物和独特的价值活动

db.test.distinct("Animals") 
[ "cat", "dog", "cow" ] 
db.test.distinct("service") 
[ "sleep", "run", "play" ] 

==猫 - > {猫:1,狗:0,牛:0}同其他

我想改变这种格式

{ "_id" : 0, "cat" : 1, "dog" : 0, "cow" : 0, "sleep" : 1, "run" : 0, "play": 0 } 
{ "_id" : 1, "cat" : 0, "dog" : 1, "cow" : 0, "sleep" : 0, "run" : 1, "play": 0 } 
{ "_id" : 2, "cat" : 0, "dog" : 0, "cow" : 1, "sleep" : 0, "run" : 0, "play": 1 } 
{ "_id" : 3, "cat" : 0, "dog" : 0, "cow" : 1, "sleep" : 1, "run" : 0, "play": 0 } 
{ "_id" : 4, "cat" : 0, "dog" : 0, "cow" : 1, "sleep" : 0, "run" : 1, "play": 0 } 
{ "_id" : 5, "cat" : 0, "dog" : 1, "cow" : 0, "sleep" : 0, "run" : 0, "play": 1 } 
{ "_id" : 6, "cat" : 1, "dog" : 0, "cow" : 0, "sleep" : 0, "run" : 1, "play": 0 } 

我该怎么做?

回答

3

与聚合框架如下我会做到这一点:

  • 组由_id
  • 算上动物
  • 算上活动
  • 排序结果按升序排列

db.test.aggregate([ { 
$group: { 
_id: "$_id", 
cat: {$sum: {$cond: [{"$eq": ["$Animals", "cat"]}, 1, 0 ] } }, 
dog: {$sum: {$cond: [{"$eq": ["$Animals", "dog"]}, 1, 0 ] } }, 
cow: {$sum: {$cond: [{"$eq": ["$Animals", "cow"]}, 1, 0 ] } }, 
sleep: {$sum: {$cond: [{"$eq": ["$activity", "sleep"]}, 1, 0 ] } }, 
run: {$sum: {$cond: [{"$eq": ["$activity", "run"]}, 1, 0 ] } }, 
play: {$sum: {$cond: [{"$eq": ["$activity", "play"]}, 1, 0 ] } } 
} }, 
{ $sort: {_id: 1}} 
]) 

在蒙戈外壳结果看起来像您正在寻找的东西:

{ "_id" : 0, "cat" : 1, "dog" : 0, "cow" : 0, "sleep" : 1, "run" : 0, "play" : 0 } 
{ "_id" : 1, "cat" : 0, "dog" : 1, "cow" : 0, "sleep" : 0, "run" : 1, "play" : 0 } 
{ "_id" : 2, "cat" : 0, "dog" : 0, "cow" : 1, "sleep" : 0, "run" : 0, "play" : 1 } 
{ "_id" : 3, "cat" : 0, "dog" : 0, "cow" : 1, "sleep" : 1, "run" : 0, "play" : 0 } 
{ "_id" : 4, "cat" : 0, "dog" : 0, "cow" : 1, "sleep" : 0, "run" : 1, "play" : 0 } 
{ "_id" : 5, "cat" : 0, "dog" : 1, "cow" : 0, "sleep" : 0, "run" : 0, "play" : 1 } 
{ "_id" : 6, "cat" : 1, "dog" : 0, "cow" : 0, "sleep" : 0, "run" : 1, "play" : 0 } 
+0

Elyasin我想代码帮助我吗? – mohamedzajith

+1

我想避免为你编写代码。这很耗时,并且不确定您的学习体验是否更有效率。我建议你尝试编码自己,然后当你被困时帮助你,是吗? – Elyasin

+1

基本上他告诉你要做的是从现有表中提取数据并以编程方式插入到新表中。我也同意这种做法,这是一次性格式转换。 –

3

我想告诉你用aggregation如下:

db.test.aggregate([ 
    {$group : { 
     _id : $_id, 
     cat : {$cond : {if: { $eq: [ "$Animals", "cat" ] }, then: 1, else: 0}}, 
     dog : {$cond : {if: { $eq: [ "$Animals", "dog" ] }, then: 1, else: 0}}, 
     cow : {$cond : {if: { $eq: [ "$Animals", "cow" ] }, then: 1, else: 0}}, 
     sleep : {$cond : {if: { $eq: [ "$activity", "sleep" ] }, then: 1, else: 0}}, 
     run : {$cond : {if: { $eq: [ "$activity", "run" ] }, then: 1, else: 0}}, 
     play : {$cond : {if: { $eq: [ "$activity", "play" ] }, then: 1, else: 0}} 
    }} 
]); 

这个片段中使用$cond集结算子+ $eq比较运算符。

更多阅读:

http://docs.mongodb.org/manual/reference/operator/aggregation/group/#group-aggregation http://docs.mongodb.org/manual/reference/operator/aggregation/cond/#cond-aggregation http://docs.mongodb.org/manual/core/aggregation-pipeline/