Mongoose findOneAndUpdate не работает, если я не указываю поле для обновления - PullRequest
2 голосов
/ 02 мая 2019

В настоящее время у меня есть следующая функция mongoose в вызове API hapi.js

    server.route({
    method: "PUT",
    path:"/api/blockinfo/{hash}",
    handler: async (request, h) => {
        try{
            var jsonPayload = JSON.parse(request.payload)
            console.log(jsonPayload)
            var result = await BlockModel.findOneAndUpdate(request.params.hash, {$set: { height : jsonPayload[Object.keys(jsonPayload)[0]]}},  {new: true});
            return h.response(result);
        }catch{

            return h.response(error).code(500);
        }
    }
})

Ее цель в основном состоит в обновлении значения с использованием PUT.В приведенном выше случае он обновит высоту поля и будет работать нормально.

Но что, если я хочу обновить произвольное поле?

Например, мой формат объекта следующий:

{"_id":"5cca9f15b1b535292eb4e468", "hash":"d6e0fdb404cb9779a34894b4809f492f1390216ef9d2dc0f2ec91f95cbfa89c9", "height":301651, "size":883, "time":1556782336, "__v":0}

В приведенном выше случае я обновил значение высоты, используя $set, но что, если я решу ввести 2 случайных поля для обновления, например, размера и времени.

Это будет мой пост в почтальоне:

{
    "size": 300,
    "time": 2
}

Ну, очевидно, это не сработает в коде выше, потому что эти поля отсутствуют в наборе.

ТАК, как мне установить этот наборавтоматически распознавать все, что нужно для обновления?

Я пытался упростить его с помощью следующего кода, но он ничего не обновит

    server.route({
    method: "PUT",
    path:"/api/blockinfo/{hash}",
    handler: async (request, h) => {
        try{
            var result = await BlockModel.findOneAndUpdate(request.params.hash, request.payload,  {new: true});
            return h.response(result);
        }catch{

            return h.response(error).code(500);
        }
    }
})

Схема

const BlockModel = Mongoose.model("blocks", {
  hash: String,
  height: Number,
  size: Number,
  time: Number
});

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Проблема с вашим ключом hash. Первый параметр / аргумент в функции findOneAndUpdate должен быть парой key value. И вот вы прямо ставите key.

Так и должно быть

handler: async (request, h) => {
  try {
    const { hash } = request.params
    var result = await BlockModel.findOneAndUpdate({ hash }, request.payload,  { new: true })
    return h.response(result)
  } catch (err) {
    return h.response(error).code(500)
  }
}

Обновление:

Вы неправильно определяете модель мангуста. Схема это не просто объект. Это должен быть мангустовый объект. Как то так

const schema = new Mongoose.Schema({
  hash: String,
  height: Number,
  size: Number,
  time: Number
})

export default Mongoose.model("blocks", schema)
0 голосов
/ 02 мая 2019
handler: async (request, h) => {
        try{
            var result = await BlockModel.findOneAndUpdate(request.params.hash, JSON.parse(request.payload ),  {new: true});
            return h.response(result);
        }catch{

            return h.response(error).code(500);
        }
    }

Поскольку мы обновляем JSON, данные должны быть в формате JSON

0 голосов
/ 02 мая 2019

Вы не добавили $set в свой упрощенный код, добавив, что он должен работать. Отправьте payload как объект с обязательными полями.

server.route({
    method: "PUT",
    path:"/api/blockinfo/{hash}",
    handler: async (request, h) => {
        try{
            var result = await BlockModel.findOneAndUpdate(request.params.hash, { $set: request.payload } ,  {new: true});
            return h.response(result);
        }catch{

            return h.response(error).code(500);
        }
    }
})
...