2015-07-20 2 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/

Смежные вопросы