Reputation: 397
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
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
Reputation: 11174
I would do it as follows with the aggregation framework:
_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}}
] )
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