MongoDB - Массив объектного фильтра с условием - PullRequest
0 голосов
/ 22 октября 2018

В моей коллекции есть файл json, который выглядит следующим образом:

[
   {
      "change":"00001",
      "patchset":"4"
   },
   //etc
]

Два разных объекта могут иметь одинаковые свойства "change".Итак, сначала я хочу сгруппировать их по свойствам «change», а внутри этой группы я хочу получить максимальное значение свойств «patchset».Мне удалось сделать это легко с помощью этой команды

db.collections.aggregate([{$group:{_id:"$change",patchset_max:{$max:"$patchset"}}}])

, но затем, и вот где я потерял это, с этим максимальным набором патчей, я хочу получить все объекты, где object.patchset = max_patchset, но все жев массиве группы.

Я пытался с $ filter и $ match, а затем вложил $ group, но ничего не работает,

Ребята, у вас есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

РЕДАКТИРОВАТЬ Ответ выше верен, но если в Mongo 3.2, есть альтернатива

db.collection.aggregate([{ 
    $group: { _id: "$change", patchset: { $push: "$$ROOT" }, patchset_max:{ $max:"$patchset" } } 
},{ 
    $project: {
        patchset: {
            $filter: { 
                input: '$patchset',
                as: 'ps',
                cond: { $eq: ['$$ps.patchset', '$patchset_max'] }
            }
        }
    }
}])
0 голосов
/ 23 октября 2018

Вам нужно использовать $$ROOT, которая является специальной переменной, представляющей весь документ, чтобы получить все элементы для каждой группы, а затем вы можете использовать $ addFields , чтобы перезаписать существующий массив, и фильтр $., чтобы получить только те документы, которые имеют patchset, равный patchset_max.Попробуйте:

db.collection.aggregate([
    {
        $group: {
            _id: "$change",
            patchset_max:{$max:"$patchset"},
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $addFields: {
            docs: {
                $filter: {
                    input: "$docs",
                    as: "doc",
                    cond: {
                        $eq: [ "$patchset_max", "$$doc.patchset" ]
                    }
                }
            }
        }
    }
])

Пример игровой площадки здесь

...