Запросы и обновление глубоко вложенного объекта с помощью mongoose - PullRequest
0 голосов
/ 31 мая 2018

У меня есть схема ниже

const ButtonSchema = new mongoose.Schema({
    conditions: mongoose.Schema.Types.Mixed
})

// Data Model
const DataSchema = new mongoose.Schema({
    buttons: [ButtonSchema],
    __v: {type: Number, default: 0}
})

//Question Model
const QuestionSchema = new mongoose.Schema({
    data: [DataSchema],
    __v: {type: Number, default: 0}
})

// Dialog Model
const Dialog = mongoose.model('Dialog', new mongoose.Schema({
    name: String,
    questions: [QuestionSchema]
}))

, по сути, объект похож на этот

{
    "download_data": [
        {
            "__v": 0,
            "data": [
                {
                    "text": [
                        "xxxx"
                    ],
                    "__v": 0,
                    "buttons": [],
                    "_id": "5afdf6cf1c1cc542c4580511",
                    "conditions": {
                        "false": {
                            "type": "endDialog",
                            "data": [
                                {
                                    "text": []
                                }
                            ]
                        }
                    }
                }
            ],
            "_id": "5afdf6cf1c1cc542c4580510",
            "type": "confirm"
        },
        {
            "__v": 0,
            "data": [
                {
                    "text": [
                        "xxxx"
                    ],
                    "__v": 0,
                    "buttons": [],
                    "_id": "5afdf6cf1c1cc542c458050f"
                }
            ],
            "_id": "5afdf6cf1c1cc542c458050e",
            "type": "endDialog"
        }
    ]}

Как видите, у меня есть уникальные идентификаторы для объекта вопроса и идентификаторыдля объектов данных

Во время обновления в идеале я хотел бы обновить только определенное поле данных с помощью _id

. Я могу получить конкретный вопрос с помощью этого

return DialogSchema.findOne({'questions._id': req.params.subId})
    .then(function(data){
         // this doesnt work
        return data.questions[req.params.index].update(req.body)
    })
    .then(function(data){
        console.log('data :', data)
    })
    .catch(function(err){
        console.log('err: ', err)
    })

Нов идеале я хотел бы просто получить объект DataSchema (вставленный в виде объектов массива в объект QuestionsSchema)

, но это не работает

  return DialogSchema.findOne({'questions.data._id': req.params.subId})
        .then(function(data){
            console.log('data : ', data)
        })
        .catch(function(err){
            console.log('err: ', err)
        })

Есть ли способ, которым я могу это сделать?

1 Ответ

0 голосов
/ 31 мая 2018

Поскольку ваше поле data в QuestionSchema является массивом, вы не можете просто получить доступ к вложенным свойствам для вложенного документа.Ваш первый запрос для получения Вопроса, а затем Данных должен быть немного обновлен.Прежде всего, это не схема, а ваш экземпляр модели, который запрашивает данные.И поскольку req.params.subId является Question идентификатором, будет более эффективным сделать запрос по этой модели:

return Question.findOne({'_id': req.params.subId})
.then(function(question) {
    ...
})

Но для обновления данных конкретного вопроса вам необходимо обновить вопросмодель, а не модель данных:

...
.then(function(question) {
   questions.data[req.params.index] = req.body
   return question.save()
}

Это необходимо сделать, поскольку вложенные документы сохраняются вместе с родительским документом.Проверьте документ Мангуста, здесь .

Обратите внимание, что questions.data должен возвращать массив ObjectId, а не массив документов Data.Чтобы решить эту проблему, вы можете использовать метод populate(), например:

return Question.findOne({'_id': req.params.subId})
.populate('data')
.then(function(question) {
    // Here questions.data is an Array of sub-documents
    ...
})

При необходимости вы можете отфильтровать или отсортировать заполненный массив data (Mongoose doc, здесь * 1024).*).

Просто небольшой комментарий о VersionKey (__v) в ваших схемах.Это свойство установлено Mongoose по умолчанию.Таким образом, вы можете удалить их.Проверьте документацию Mongoose о it .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...