Да, это вполне достижимо с aggregation framework. Ваш агрегатный конвейер будет состоять из оператора $match
, который станет начальным этапом. Это фильтрует документы в коллекции по указанным критериям. Следующими этапами перехода будут пара операторов $uniwnd
на обоих массивах, players
и вложенных . После $uniwnd
вам понадобится еще $match
, чтобы затем фильтровать документы с деконструированным массивом до требуемых критериев, которые станут вашим окончательным решением.
Давайте продемонстрируем это, вставив пару документов с помощью данной схемы в коллекции команды в Монго оболочки:
db.team.insert([
{
"players" : [
{
"trikots" : [
{
"isNew" : true,
"color" : "red"
},
{
"isNew" : true,
"color" : "blue"
}
]
},
{
"trikots" : [
{
"isNew" : false,
"color" : "red"
},
{
"isNew" : true,
"color" : "green"
}
]
}
]
},
{
"players" : [
{
"trikots" : [
{
"isNew" : false,
"color" : "red"
},
{
"isNew" : false,
"color" : "blue"
}
]
}
]
}
])
выше трубопровода агрегация может быть реализован следующим образом:
var pipeline = [
{
"$match": {
"players.trikots.isNew": true,
"players.trikots.color": "red"
}
},
{
"$unwind": "$players"
},
{
"$unwind": "$players.trikots"
},
{
"$match": {
"players.trikots.isNew": true,
"players.trikots.color": "red"
}
}
];
db.team.aggregate(pipeline);
Выход:
/* 1 */
{
"result" : [
{
"_id" : ObjectId("554bce9a2ba32ccf7f139bae"),
"players" : {
"trikots" : {
"isNew" : true,
"color" : "red"
}
}
}
],
"ok" : 1
}
Ваш агрегация мангуст был бы похож:
Team.aggregate(pipeline).exec(callback);
или с помощью Мангуст aggregation pipeline builder для беглого разговора:
Team.aggregate()
.match({"players.trikots.isNew": true,"players.trikots.color": "red"})
.unwind("players")
.unwind("players.trikots")
.match({"players.trikots.isNew": true,"players.trikots.color": "red"})
.exec(callback);
Теперь я получаю следующую ошибку: «исключение: имена FieldPath поля не может начинаться с ' $».» Какие-либо предложения? –
@FlorianMozart Мои извинения Я дал вам непроверенный код, я обновил ответ, поэтому дайте ему попробовать и дайте мне знать. – chridam
Последний вопрос: если у меня есть несколько игроков из одной команды, у которых есть требования. Как я могу агрегировать, чтобы получить один командный объект со всеми этими игроками? –