У меня есть коллекция MongoDB, называемая изменениями, которая содержит следующие данные
{ "date" : ISODate("2014-06-09T00:00:00.000Z"), "field" : "ip", "from" : "157.11.209.123", "to" : "107.21.109.254" } { "date" : ISODate("2014-05-15T00:00:00.000Z"), "field" : "ip", "from" : "107.21.109.254", "to" : "157.11.209.123" } { "date" : ISODate("2014-06-09T00:00:00.000Z"), "field" : "registration", "from" : "Old service", "to" : "Some new service" }
Затем я хочу сделать типичный SQL-запрос, который учитывает вхождения и группирует его по field
. Итак, я создал запрос в MongoDB
db.changes.group({ "key": { "field": true }, "initial": { "count": 0, }, "reduce": function(obj, prev) { prev.count++; }, });
Он отлично работает, но как я могу преобразовать его в работу с Laravel 4 ? Я использую jenssegers / laravel–mongodb для связи с сервером mongo.
Кроме того, у меня больше условий в запросе, который я удалил, чтобы сделать мой вопрос более ясным, поэтому я ищу решение для преобразования именно этого запроса в laravel, а не другие возможные решения :).
Вы оба лучше используете методы структуры агрегации, а также погружаетесь в необработанный объект коллекции MongoDB, предоставленный из основного драйвера, чтобы сделать это. Это гораздо лучший вариант, который пытается перевести синтаксис:
// Returns the original Mongo Result $result = DB::collection('changes')->raw(function($collection) { return $collection->aggregate(array( array( '$group' => array( '_id' => '$field', 'count' => array( '$sum' => 1 ) ) ) )); });
Результат немного отличается от результата метода, такого как .group()
но он использует собственный код на сервере MongoDB и не полагается на интерпретацию JavaScript, как это .group()
метод .group()
, будучи действительно оберткой вокруг mapReduce.
Конечный результат намного быстрее, а также, как правило, более эффективный, чем вы выйдете из интерфейса native framework.
Так что используйте собственный способ MongoDB для лучшей производительности.