У меня есть случай, когда я хочу запросить коллекцию документов, у которых есть количество элементов под полем «формы». Проблема в решении заключалась в том, чтобы вернуть только документы, содержащие все документов, содержащихся в «формах» с определенным статусом «закрыто».Как вернуть исходный документ обратно после агрегации
Так вот пример двух разных документов в коллекции:
{
"_id" : "Tvq444454j",
"name" : "Jim",
"forms" : [
{
"name" : "Jorney",
"status" : "closed"
},
{
"name" : "Women",
"status" : "void"
},
{
"name" : "Child",
"status" : "closed"
},
{
"name" : "Farm",
"status" : "closed"
}
]
},
{
"_id" : "Tvq579754r",
"name" : "Tom",
"forms" : [
{
"name" : "PreOp",
"status" : "closed"
},
{
"name" : "Alert",
"status" : "closed"
},
{
"name" : "City",
"status" : "closed"
},
{
"name" : "Country",
"status" : "closed"
}
]
}
и ожидаемый результат:
{
"_id" : "Tvq579754r",
"name" : "Tom",
"forms" : [
{
"name" : "PreOp",
"status" : "closed"
},
{
"name" : "Alert",
"status" : "closed"
},
{
"name" : "City",
"status" : "closed"
},
{
"name" : "Country",
"status" : "closed"
}
]
}
Поскольку не существует стандартного оператора запроса в соответствии все из элементов массива при этом условии, решение было найдено с использованием агрегации. Это вернет _id документов в коллекции, которые имеют все свои элементы «формы», установленные в статус «закрыто».
db.forms.aggregate([
{$unwind: "$forms" },
{$group: { _id: "$_id", status: {$addToSet: "$forms.status" }}},
{$unwind: "$status"},
{$sort: { _id: 1, status: -1 }},
{$group: {_id: "$_id", status: {$first: "$status"}}},
{$match:{ status: "closed" }}
])
Так как я хотел бы ожидать, чтобы вернуться множество документов в результатах, я хотел бы избежать выдач другой находки, или серии находок просто получить документы, которые соответствуют возвращаемым _ID лет.
Учитывая это, можно ли каким-либо образом вернуть исходные документы из агрегирования точно в том же виде, что и в коллекции, при этом все еще выполняя этот тип фильтрации?
Там должен быть оператор '*' или что-то в ближайшее время, что сможет вернуть исходный документ в полном виде в агрегации трубопровода – Sammaye
@Sammaye Я считаю, что вы ссылаясь на $$ ROOT, который предназначен для другой цели, но может быть использован здесь. Это должно быть доступно в версии 2.6. Это один из методов, который можно использовать ** сейчас **, и все же, возможно, ускользнул от многих людей. –