Самый простой способ - использовать агрегацию.
Вам необходимо объединить все идентификаторы из массива ответов в коллекцию ответов, используя $ lookup, а затем использовать $ filter, чтобы отфильтровать его по «официальным».
объедините документы из коллекции Ответов, если _ids совпадают
{
$lookup: {
from: "Answer",
foreignField: "_id",
localField: "answer",
as: "answer"
}
}
Результат будет:
{
"_id" : ObjectId("5d93dfaf40024619dcc61896"),
"solved" : false,
"answer" : [
{
"_id" : ObjectId("5d969dbf7d496a256443eeca"),
"official" : false,
"description" : "Toma aqui a sua resposta",
"createdAt" : "2019-10-04T01:17:51.454Z",
"__v" : 0
},
{
"_id" : ObjectId("5d969f7b7d496a256443eecb"),
"official" : true,
"description" : "Esste e um teeeeste",
"createdAt" : "2019-10-04T01:25:15.829Z",
"__v" : 0
}
],
"user" : "5d8963afa0014a289c8d7112",
"title" : "Ola mundo",
"description" : "esse e um teste",
"discipline" : "5d8fb8e04becf712f8293b5b",
"createdAt" : "2019-10-01T23:22:23.168Z",
"__v" : 0
}
Теперь, когда вы присоединились к документам, вы можете отфильтровать его по "официальное »поле с использованием $ addFields и $ filter. $ addFields добавляет новые поля в документ https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/. В этом решении я использую то же имя поля «answer», оно перезапишет массив ответов с отфильтрованными документами.
{
$addFields: {
answer: {
$filter: {
input: "$answer",
as: "answer",
cond: { $eq: [ "$$answer.official", true ] }
}
}
}
}
Результатбудет:
{
"_id" : ObjectId("5d93dfaf40024619dcc61896"),
"solved" : false,
"answer" : [
{
"_id" : ObjectId("5d969f7b7d496a256443eecb"),
"official" : true,
"description" : "Esste e um teeeeste",
"createdAt" : "2019-10-04T01:25:15.829Z",
"__v" : 0
}
],
"user" : "5d8963afa0014a289c8d7112",
"title" : "Ola mundo",
"description" : "esse e um teste",
"discipline" : "5d8fb8e04becf712f8293b5b",
"createdAt" : "2019-10-01T23:22:23.168Z",
"__v" : 0
}
Это полный запрос:
db.Question.aggregate([
{
$lookup: {
from: "Answer",
foreignField: "_id",
localField: "answer",
as: "answer"
}
},
{
$addFields: {
answer: {
$filter: {
input: "$answer",
as: "answer",
cond: { $eq: [ "$$answer.official", true ] }
}
}
}
}])