mohamedzajith
mohamedzajith

Reputation: 397

mongodb data conversion in field

my test collection

{ "_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" }

find the unique value for Animals and activity

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

after that Animals == cat -> { cat:1, dog:0, cow:0 } same as other

I want to change this type format

{ "_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 }

How can I do it?

Upvotes: 1

Views: 93

Answers (2)

Ramin Omrani
Ramin Omrani

Reputation: 3761

I think you show use aggregation as follows:

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}}
    }}
]);

this snippet uses $cond aggregation operator + $eq comparison operator.

more to read :

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/

Upvotes: 3

Ely
Ely

Reputation: 11174

I would do it as follows with the aggregation framework:

  • group by _id
  • count the animals
  • count the activity
  • sort the result in ascending order

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}}
] )

The result in mongo shell looks like what you are looking for:

{ "_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 }

Upvotes: 3

Related Questions