.updateOne на MongoDB не работает в Node.js
У меня есть следующий код:
connection((db) => {
db.collection('orders')
.updateOne(
{ "_id": req.body._id}, // Filter
{"name": req.body.name} // Update
)
.then((obj) => {
console.log('Updated - ' + obj);
res.redirect('orders')
})
.catch((err) => {
console.log('Error: ' + err);
})
})
Я хочу изменить имя в заказе, но он не обновляет его. Результат в консоли:
Updated - {"n":0,"nModified":0,"ok":1}
Я попытался прочитать документацию, но это ужасно
EDIT: {$set: {"name": req.body.name}},
не работает
EDIT 2: Пропущенный идентификатор соответствует _id в базе данных. Может быть, проблема в том, что я запрашиваю простой текстовый идентификатор, в то время как в базе данных он называется "ObjectId (" 5a42ja... ")
Ответы
Ответ 1
Может быть, вы должны использовать "$ set" в своем запросе на обновление следующим образом:
{$set: {"name": req.body.name}}, // Update
Больше информации в документации
РЕДАКТИРОВАТЬ
Если это не сработает, возможно, это связано с отсутствием соответствия с вашим фильтром.
Может быть, вы должны попытаться сопоставить ObjectId следующим образом:
var ObjectID = require('mongodb').ObjectID;
// In your request
{ "_id": ObjectID(req.body._id)}, // Filter
Надеюсь, поможет.
Ответ 2
Используйте {$set: {"name": req.body.name}}
(как упомянуто Sparw) для обновления свойств, которые вы хотите в документе. Кроме того, если идентификатор, который вы передаете в качестве параметра, в коллекции не существует (и вы хотите создать его с тем же идентификатором), вы можете передать его в качестве третьего параметра {upsert: true}
чтобы создать его.
В вашем примере:
connection((db) => {
db.collection('orders')
.updateOne(
{ "_id": req.body._id}, // Filter
{$set: {"name": req.body.name}}, // Update
{upsert: true} // add document with req.body._id if not exists
)
.then((obj) => {
console.log('Updated - ' + obj);
res.redirect('orders')
})
.catch((err) => {
console.log('Error: ' + err);
}) })
Ответ 3
Трудный ответ @Spraw подходит для некоторых случаев, но иногда он не работает. Я думаю, что удобный ответ - updateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback)
.
_id
в mongodb
является BSON
объект и должен быть создан.
Ответ 4
Для меня я должен удалить поле "_id"/id перед передачей объекта в обновлении.
Или это скажет, что поле недействительно.
Очевидно, что обновлять ключ, пока вы используете его в качестве справочного материала, - не лучшая вещь.
Ответ 5
Слишком поздно, но для новичков или студентов, изучающих nodejs с помощью mongodb. вместо метода updateOne
просто используйте метод update
.
connection((db) => {
db.collection('orders')
.update(
{ "_id": req.body._id}, // Filter
{$set: {"name": req.body.name}}, // Update
{upsert: true} // add document with req.body._id if not exists
)
.then((obj) => {
console.log('Updated - ' + obj);
res.redirect('orders')
})
.catch((err) => {
console.log('Error: ' + err);
}) })