У меня есть следующая схема, определенная в mon goose.
const location4Schema = new mongoose.Schema({
title: {
type: String,
unique: true
}
});
const location3Schema = new mongoose.Schema({
title: {
type: String,
unique: true
},
locations4: [location4Schema]
});
const location2Schema = new mongoose.Schema({
title: {
type: String,
unique: true
},
locations3: [location3Schema]
});
const location1Schema = new mongoose.Schema({
title: {
type: String,
unique: true
},
locations2: [location2Schema]
});
Теперь я хочу найти массив location4 , используя _id указанного c location3 . Я хочу получить результат
[
{"_id": ObjectId("213213"), "title":"location4_title"},
{"_id": ObjectId("213213"), "title":"location4_title"},
...
]
. На данный момент я использую этот способ (используя идентификатор location2 и location3 id):
db.location1Schema.aggregate([
{"$unwind" : "$locations2"},
{$match: {"locations2._id": ObjectId("2131231")}},
{"$unwind" : "$locations2.locations3"},
{$match: {"locations2.locations3._id": ObjectId("21312321")}},
{$project:
{
"locations2.locations3.locations4._id":1,
"locations2.locations3.locations4.title":1, _id:0
}
}
])
**The result is:**
"locations2" : {
"locations3" : {
"locations4" : [
{
"_id" : ObjectId("213213"),
"title" : "some_title"
},
{
"_id" : ObjectId("2311"),
"title" : "some_title"
}
]
}
}
Вот мои проблемы:
- Есть ли лучший (быстрее или чище) способ, чем тот, который я использую сейчас? Что он?
- Нужны ли мне все идентификаторы, чтобы найти мой массив (location2 и location3), или я могу сделать это только с идентификатором location3?
- Если у меня есть еще более глубокое вложение, каков наилучший способ выполнения запросов?
- Кроме того, мой результат не самый лучший, так как он не возвращает нужный мне массив. Поэтому я должен исправить это на бэкэнде.