How I can sort this data, using Mongo functionality:
Input
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
{ "_id" : 2, "domainName" : "test2.com", "hosting" : "aws.amazon.com"}
{ "_id" : 3, "domainName" : "test3.com", "hosting" : "aws.amazon.com" }
{ "_id" : 4, "domainName" : "test4.com", "hosting" : "hostgator.com" }
{ "_id" : 5, "domainName" : "test5.com", "hosting" : "aws.amazon.com" }
{ "_id" : 6, "domainName" : "test6.com", "hosting" : "cloud.google.com" }
{ "_id" : 7, "domainName" : "test7.com", "hosting" : "aws.amazon.com" }
{ "_id" : 8, "domainName" : "test8.com", "hosting" : "hostgator.com" }
{ "_id" : 9, "domainName" : "test9.com", "hosting" : "cloud.google.com" }
{ "_id" : 10, "domainName" : "test10.com", "hosting" : "godaddy.com" }
In order by hosting field, to get result, for example in this order:
1) First - all godaddy;
2) Second - all AWS;
3) and next, everything else.
Output
{
"result" : [
{
"_id" : 10,
"domainName" : "test10.com",
"hosting" : "godaddy.com"
},
{
"_id" : 2,
"domainName" : "test2.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 3,
"domainName" : "test3.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 5,
"domainName" : "test5.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 7,
"domainName" : "test7.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 1,
"domainName" : "test1.com",
"hosting" : "hostgator.com"
},
{
"_id" : 4,
"domainName" : "test4.com",
"hosting" : "hostgator.com"
},
{
"_id" : 6,
"domainName" : "test6.com",
"hosting" : "cloud.google.com"
},
{
"_id" : 8,
"domainName" : "test8.com",
"hosting" : "hostgator.com"
},
{
"_id" : 9,
"domainName" : "test9.com",
"hosting" : "cloud.google.com"
},
]
}
With this example i want to return results in more relevant way for user. And in origanl task I want to sort this using few another collections, which serve additional information.
But will be good enough if you helps me with previous task?
UPD: About second part of question.
One more task is how to return sortable data from one collection in dependence of another.
Example:
first collection the same which was given before:
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
...
second collection, provide some additional info about hosting:
{ '_id': 123, 'quality':'best', 'hostings': ["hostgator.com", "aws.amazon.com"]},
{ '_id': 321, 'quality':'good', 'hostings': ["cloud.google.com"]},
{ '_id': 345, 'quality':'bad', 'hostings': ["godaddy.com"]},
And in result, I need to return from first collection data in this order:
1) First all good hostings 2) second all good 3) third all bad
Output:
{
"result" : [
//Best:
{
"_id" : 1,
"domainName" : "test1.com",
"hosting" : "hostgator.com"
},
{
"_id" : 4,
"domainName" : "test4.com",
"hosting" : "hostgator.com"
},
{
"_id" : 8,
"domainName" : "test8.com",
"hosting" : "hostgator.com"
},
{
"_id" : 2,
"domainName" : "test2.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 3,
"domainName" : "test3.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 5,
"domainName" : "test5.com",
"hosting" : "aws.amazon.com"
},
{
"_id" : 7,
"domainName" : "test7.com",
"hosting" : "aws.amazon.com"
},
// Good:
{
"_id" : 9,
"domainName" : "test9.com",
"hosting" : "cloud.google.com"
},
{
"_id" : 6,
"domainName" : "test6.com",
"hosting" : "cloud.google.com"
},
//Bad
{
"_id" : 10,
"domainName" : "test10.com",
"hosting" : "godaddy.com"
}
]
}
UPDATE 2
I get good answer and example on previous example. Thank you so much! But I stack with another example.
I need to compare IDs of 3 collections to sort in order - first: friend, second: 'requests', and: other users.
Input
db.friends.find({userId: currentUser});
// {"_id" : "PgC7LrtaZtQsShtzT", "userId" : "tHuxnWxFLHvcpRgHb", "friendId" : "jZagPF7bd4aW8agXb",}
db.requests.find({userId: currentUser});
// looks like friend but with 'requesterId'
And now I need to aggregate 'users' collection, define the score which matches with previous two collections (friends, requests).
Using provided answer, I managed result but only with one collection. How can I make this with 3 or multiple?
You can project each of the hosting
into separate type denoted by integers, and finally sort on these integers. Illustrated in the aggregation pipeline below
[
{$lookup: {
from: 'secondCollectionStoringQuality',
localField: 'hosting',
foreignField: 'hostings',
as: 'nw'
}},
{$unwind: '$nw'},
{$project: {
domainName: 1,
hosting: 1,
type: {
$cond: [
{$eq: ['$nw.quality', 'best']},
0,
{$cond: [
{$eq: ['$nw.quality', 'good']},
1,
2
]}
]
}
}},
{$sort: {type: 1}}
]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With