之前已经试过node连接数据库:koa中如何获取到mongodb的数据并展示在页面上
然后现在想做更新,然后按着http://www.runoob.com/nodejs/nodejs-mongodb.html 中的例子来做,如果全部条件都更新,则理论来说代码如下:
(错误示范)
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = {"_id":'XXXXXXXXXX'}; // 查询条件
var updateStr = {$set: { "url" : "https://www.runoob.com" }};
dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) {
if (err) throw err;
console.log("文档更新成功");
db.close();
});
});
然发现查询不出任何结果,后来通过断点发现这里的_id我传的是字符串。
(正确示范)
var MongoClient = require('mongodb').MongoClient;
var ObjectId = require('mongodb').ObjectId ;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var whereStr = {_id:ObjectId(XXXXXXXX)}; // 查询条件
var updateStr = {$set: { "url" : "https://www.runoob.com" }};
dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) {
if (err) throw err;
console.log("文档更新成功");
db.close();
});
});
因为_id是自动生成的,然后键值大约是这样:ObjectId("5bc6f3f016e4e13bc8c0f1d5"),页面获取的结果却是5bc6f3f016e4e13bc8c0f1d5,要想修改,需要要加上ObjectId()
这里普及下ObjectId知识:
MongoDB中我们经常会接触到一个自动生成的字段:”_id”,类型为ObjectId。
之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。但在分布式环境下,这种方法就不可行了,会产生冲突。为此,MongoDB采用了一个称之为ObjectId的类型来做主键。ObjectId是一个12字节的 BSON 类型字符串。按照字节顺序,一次代表:
4字节:UNIX时间戳
3字节:表示运行MongoDB的机器
2字节:表示生成此_id的进程
3字节:由一个随机数开始的计数器生成的值