У меня есть коллекция «книга»:MongoDB водитель Perl: другой результат после агрегации
{
"_id" : ObjectId("54901b078b823f2014080700"),
"title" : "title1",
"available" : 0,
"time" : 14318789245,
"score" : 1,
"categories" : ["fiction","humor"]
},
{
"_id" : ObjectId("54901b078b823f2014080701"),
"title" : "title2",
"available" : 1,
"time" : 14318789745,
"score" : 1,
"score_fiction": 5,
"categories" : ["fiction",]
}
...
{
"_id" : ObjectId("54901b078b823f2014080751"),
"title" : "titleN",
"available" : 1,
"time" : 14318789545,
"score" : 4,
"score_fiction": 2,
}
Я агрегировать его с помощью этого сценария:
my $books = $mango->db('test')->collection('books')->aggregate([
{'$match' => {categories => fiction}},
{'$project' =>
{
'av' => {'$cmp' => ['$available', 0] },
title => 1,
scr => {'$ifNull' => ['$score_fiction' , '$score'] },
time =>1}
},
{'$sort' => {av => -1, scr => -1, time => -1}},
{'$limit' => 10}
]);
while (my $book = $books->next) {
print $book->{title} . " [" . $book->{scr} . "]\n";
После 5-7 пробегов я получаю два различных результата :
- С сортировкой по обязательным полям.
- Без сортировки. (возможно, с сортировкой по времени или «$ natural»
время добавления).
Когда я запускаю этот конвейер агрегации в оболочке монго - он работает с правильной сортировкой.
db.books.aggregate([{'$match' : {categories : 'fiction'},
{'$project' : {'av' : {'$cmp' : ['$available', 0] },
title : 1,
scr : {'$ifNull' : ['$score_fiction' , '$score'] },
time:1}},
{'$sort' : {av : -1,scr :-1, time : -1}},
{'$limit': 10}]);
Проблема в драйвере или в голове?
PS Я пробовал Mango и официальный драйвер MongoDB, но результат тот же.
Вы фактически вставив одиночные кавычки переменные, такие как ' '$ project'', или в том, что артефакт вашему примеру? Потому что они не интерполируют. –
Да. Он одинарный. Это строки - операторы для MongoDB – Spear5030