私は次のコードを持っています:
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}
ドキュメントを読みましたが、恐ろしいです
編集:{$set: {"name": req.body.name}},
も機能しませんでした
編集2:渡されたIDは、データベース内の_idと一致します。データベース内で「ObjectId( '5a42ja ...')」と呼ばれているときにプレーンテキストIDを照会していることが問題になる可能性があります
次のように、更新クエリで「$ set」を使用する必要があります。
{$set: {"name": req.body.name}}, // Update
ドキュメント の詳細
[〜#〜] edit [〜#〜]
動作しない場合、これはおそらくフィルターと一致しないためです。
たぶん、次のようなObjectIdとの一致を試みる必要があります。
var ObjectID = require('mongodb').ObjectID;
// In your request
{ "_id": ObjectID(req.body._id)}, // Filter
それが役に立てば幸い。
つかいます {$set: {"name": req.body.name}}
(Sparwが述べたように)ドキュメントで必要なプロパティを更新します。また、パラメーターとして渡すIDがコレクションに存在しない場合(同じIDを持つIDを作成する場合)、3番目のパラメーターとして渡すことができます{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);
}) })
タフな@Sprawの答えは場合によっては正しいが、時にはうまくいかないこともある。便利な答えはupdateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback)
だと思います。
mongodb
の_id
はBSON
オブジェクトであり、インスタンス化する必要があります。