Как сортировать, когда в некоторых документах отсутствует ключ в MongoDB? - PullRequest
0 голосов
/ 04 марта 2012

У меня есть статьи, отсортированные по рейтингу, используя .sort( { rating : -1 } )

У меня много статей, у которых нет рейтинга (в БД у них даже нет ключа рейтинга). На переднем крае я показываю их со скоростью 0,5 на 1.

Когда я сортирую статьи, у меня теперь такой порядок:

1 1 0.89 0.7 0.5 0.2 0.1 0 0 0 0 0 no_key no_key no_key no_key no_key no_key...

Но я хотел бы принять во внимание, что no_key больше 0,5 рейтинга, чем ноль (еще ниже в предыдущей сортировке). Итак, я хотел бы что-то вроде этого:

1 1 0.89 0.7 0.5 no_key no_key no_key no_key no_key no_key... 0.2 0.1 0 0 0 0 0 

Я хочу избежать того, чтобы заполнять недостающие рейтинговые ключи в статьях без рейтинга на 0,5.

Какие-нибудь хитрости? Есть идеи?

1 Ответ

3 голосов
/ 04 марта 2012

Итак, для этого требуется три отдельных запроса, но пока не выйдет структура агрегации (http://www.mongodb.org/display/DOCS/Aggregation+Framework), возможно, это лучший способ:

> db.test.save({rating:1});
> db.test.save({rating:2});
> db.test.save({rating:3});
> db.test.save({rating:4});
> db.test.save({rating:0.5});
> db.test.save({rating:0});
> db.test.save({rating:0}); 
> db.test.save({rating:0});
> db.test.save({rating:-1});
> db.test.save({});
> db.test.save({});
> db.test.save({});
> db.test.find({rating:{$gte:.5}}).sort({rating:-1});
{ "_id" : ObjectId("4f52c707621918e231bc55da"), "rating" : 4 }
{ "_id" : ObjectId("4f52c705621918e231bc55d9"), "rating" : 3 }
{ "_id" : ObjectId("4f52c703621918e231bc55d8"), "rating" : 2 }
{ "_id" : ObjectId("4f52c700621918e231bc55d7"), "rating" : 1 }
{ "_id" : ObjectId("4f52c70b621918e231bc55db"), "rating" : 0.5 }
> db.test.find({rating:{$exists:false}});
{ "_id" : ObjectId("4f52c718621918e231bc55e0") }
{ "_id" : ObjectId("4f52c719621918e231bc55e1") }
{ "_id" : ObjectId("4f52c71a621918e231bc55e2") }
> db.test.find({rating:{$lt:.5}}).sort({rating:-1});
{ "_id" : ObjectId("4f52c70e621918e231bc55dc"), "rating" : 0 }
{ "_id" : ObjectId("4f52c712621918e231bc55dd"), "rating" : 0 }
{ "_id" : ObjectId("4f52c712621918e231bc55de"), "rating" : 0 }
{ "_id" : ObjectId("4f52c714621918e231bc55df"), "rating" : -1 }
...