Mongodb, используя агрегат в сочетании с фильтром?

Я пытаюсь преобразовать сценарий PHP, который основан на базе данных MySQL, чтобы запустить его на базе данных MongoDB. Я решил основные вопросы, кроме одного.

Представьте, что у меня есть библиотека (это коллекция), каждый документ представляет собой запись в книге. Поэтому мне нужно знать, сколько разных авторов в библиотеке написано на определенном языке (другое поле).

На данный момент у меня есть этот код, и я не знаю, как продолжить:

$test = array(
array(
'$group' => array(
'_id' => array('author' => '$author' )
)
)
);
$out = $db->$collection->aggregate($test);

Благодарю.

0

Решение

Если вы хотите установить фильтр, вам нужно запустить конвейер с $ матч,команда будет:

db.collection.aggregate([
{ "$match" : {lang : "en"} },
{"$group":{"_id": {"author" : "$author"} , "total" : {"$sum" : 1} }}
])

Если вы конвертируете это в PHP, это будет:

$test = array(
array('$match' => array("lang" => "en")),
array(
'$group' => array(
"_id" => array('author' => '$author'),
"total" => array('$sum' =>  1)
),
),
);

В этом случае вы должны передать язык на первом этапе (сопоставить / отфильтровать).

Если вы хотите, чтобы для «всех языков» вам просто нужно поместить язык в оператор $ group

db.collection.aggregate([
{"$group":{"_id": {"author" : "$author", lang : "$lang"} , "total" : {"$sum" : 1} }}
])

Я позволю вам подтолкнуть это в PHP

Вы можете найти больше информации о $ матч Вот:
http://docs.mongodb.org/manual/reference/operator/aggregation/match/

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]