получить массив из нескольких уровней вложенной модели - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть следующая схема, определенная в 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"
            }
        ]
    }
}

Вот мои проблемы:

  1. Есть ли лучший (быстрее или чище) способ, чем тот, который я использую сейчас? Что он?
  2. Нужны ли мне все идентификаторы, чтобы найти мой массив (location2 и location3), или я могу сделать это только с идентификатором location3?
  3. Если у меня есть еще более глубокое вложение, каков наилучший способ выполнения запросов?
  4. Кроме того, мой результат не самый лучший, так как он не возвращает нужный мне массив. Поэтому я должен исправить это на бэкэнде.
...