更新 nedb 中的一行
Update a row in nedb
我在nedb中有以下数据。
["UserId":"1446943507761","UserName":"xxx","link":"xxx.html","taskDone":"false","id":14,"_id":"fdaaTWSxloQZdYlT"]
["UserId":"1446943507761","UserName":"xxx","link":"xxx.html","taskDone":"false","id":1,"_id":"fzh2cedAXxT76GwB"]
["UserId":"1446943507761","UserName":"xxx","link":"xxx.html","taskDone":"false","id":0,"_id":"k4loE7XR5gioQk54"]
我正在尝试更新 ID 为 0 的行并将 taskDone 的值设置为 true。我使用以下查询将值设置为 true
db.taskmap.update({ _id: "k4loE7XR5gioQk54", UserName:"xxx" }, { $set: { taskDone: "true"} }, function (err, numReplaced) {
console.log("replaced---->" + numReplaced);
});
它会更新值,但会更新为新行。它基本上插入一个具有相同值的新行,除了 taskdone 值为 true。它不会删除现有数据。因此,在更新后的最终数据 table 中,我得到了 id 0 的两行,除了 taskDone 之外,所有值都相同。我不确定我是否做错了什么。如果有人能告诉我更新值的正确方法,那将会很有帮助。
update
需要四个参数
var Datastore = require('nedb');
var db = new Datastore();
db.insert(
[
{
"UserId":"1446943507761",
"UserName":"xxx",
"link":"xxx.html",
"taskDone":"false",
"id":14,
"_id":"fdaaTWSxloQZdYlT"
},
{
"UserId":"1446943507761",
"UserName":"xxx",
"link":"xxx.html",
"taskDone":"false",
"id":1,
"_id":"fzh2cedAXxT76GwB"
},
{
"UserId":"1446943507761",
"UserName":"xxx",
"link":"xxx.html",
"taskDone":"false",
"id":0,
"_id":"k4loE7XR5gioQk54"
}],
function (err, newDocs) {
// empty here
}
);
db.update(
{ _id: "k4loE7XR5gioQk54", UserName:"xxx" },
{ $set: { taskDone: "true"} },
{},// this argument was missing
function (err, numReplaced) {
console.log("replaced---->" + numReplaced);
}
);
// should give the correct result now
db.find({}).exec(function (err, docs) {console.log(docs);});
您应该在 db.update();
结束时再次调用 db.loadDatabase();
以查看,不会出现具有相同 _id:
的第二行,而是直接更新特定文档。
编辑:
看起来有时当您执行 db.update()
时,应该更新的文档会出现两次而不是在数据库中。当我更新服务器列表中的条目时,数据库中出现了多个具有修改值的条目。因此,要避免这种情况,只需执行以下操作。 (我采用了建议的相同代码作为答案)
db.update(
{ _id: "k4loE7XR5gioQk54", UserName:"xxx" },
{ $set: { taskDone: "true"} },
{},// this argument was missing
function (err, numReplaced) {
console.log("replaced---->" + numReplaced);
db.loadDatabase();
}
);
这样做可以防止这种情况发生。我测试了很多次,问题消失了。
我在nedb中有以下数据。
["UserId":"1446943507761","UserName":"xxx","link":"xxx.html","taskDone":"false","id":14,"_id":"fdaaTWSxloQZdYlT"]
["UserId":"1446943507761","UserName":"xxx","link":"xxx.html","taskDone":"false","id":1,"_id":"fzh2cedAXxT76GwB"]
["UserId":"1446943507761","UserName":"xxx","link":"xxx.html","taskDone":"false","id":0,"_id":"k4loE7XR5gioQk54"]
我正在尝试更新 ID 为 0 的行并将 taskDone 的值设置为 true。我使用以下查询将值设置为 true
db.taskmap.update({ _id: "k4loE7XR5gioQk54", UserName:"xxx" }, { $set: { taskDone: "true"} }, function (err, numReplaced) {
console.log("replaced---->" + numReplaced);
});
它会更新值,但会更新为新行。它基本上插入一个具有相同值的新行,除了 taskdone 值为 true。它不会删除现有数据。因此,在更新后的最终数据 table 中,我得到了 id 0 的两行,除了 taskDone 之外,所有值都相同。我不确定我是否做错了什么。如果有人能告诉我更新值的正确方法,那将会很有帮助。
update
需要四个参数
var Datastore = require('nedb');
var db = new Datastore();
db.insert(
[
{
"UserId":"1446943507761",
"UserName":"xxx",
"link":"xxx.html",
"taskDone":"false",
"id":14,
"_id":"fdaaTWSxloQZdYlT"
},
{
"UserId":"1446943507761",
"UserName":"xxx",
"link":"xxx.html",
"taskDone":"false",
"id":1,
"_id":"fzh2cedAXxT76GwB"
},
{
"UserId":"1446943507761",
"UserName":"xxx",
"link":"xxx.html",
"taskDone":"false",
"id":0,
"_id":"k4loE7XR5gioQk54"
}],
function (err, newDocs) {
// empty here
}
);
db.update(
{ _id: "k4loE7XR5gioQk54", UserName:"xxx" },
{ $set: { taskDone: "true"} },
{},// this argument was missing
function (err, numReplaced) {
console.log("replaced---->" + numReplaced);
}
);
// should give the correct result now
db.find({}).exec(function (err, docs) {console.log(docs);});
您应该在 db.update();
结束时再次调用 db.loadDatabase();
以查看,不会出现具有相同 _id:
的第二行,而是直接更新特定文档。
编辑:
看起来有时当您执行 db.update()
时,应该更新的文档会出现两次而不是在数据库中。当我更新服务器列表中的条目时,数据库中出现了多个具有修改值的条目。因此,要避免这种情况,只需执行以下操作。 (我采用了建议的相同代码作为答案)
db.update(
{ _id: "k4loE7XR5gioQk54", UserName:"xxx" },
{ $set: { taskDone: "true"} },
{},// this argument was missing
function (err, numReplaced) {
console.log("replaced---->" + numReplaced);
db.loadDatabase();
}
);
这样做可以防止这种情况发生。我测试了很多次,问题消失了。