NeDB教程

NeDB教程

简介

⚠️ ⚠️ ⚠️ **警告:**此库不再维护,可能存在错误和安全问题。

NeDB是一款用JavaScript语言编写的内存数据库。适用于 Node.js、nw.js、Electron 和浏览器的嵌入式持久或内存数据库,100% JavaScript,无二进制依赖

安装NeDB

# 安装nedb
npm install nedb --save

API

  • 创建/加载数据库
  • 新增数据
  • 查询数据
    • 基本查询
    • 运算符查询
    • 排序和分页
  • 计数查询
  • 更新数据
  • 删除数据

创建/加载数据库

​ 您可以将 NeDB 用作仅内存中的数据存储或持久性数据存储。一个数据存储相当于一个 MongoDB 集合。构造函数的使用方式如下,new Datastore(options)其中options是一个具有以下字段的对象:

  • filename(可选):保存数据的文件的路径。如果为空,数据存储将自动仅在内存中。它不能以空格结尾,~NeDB 使用它来执行崩溃安全写入的临时文件。
  • inMemoryOnly(可选,默认为false):数据是否仅在内存中。
  • timestampData(可选,默认为false):用字段createdAt和来标记所有文档的插入和最后更新的时间戳updatedAt。用户指定的值会覆盖自动生成,通常对测试有用。
  • autoload(可选,默认为false):如果使用此选项,数据库将在创建时自动从数据文件加载(无需调用loadDatabase)。在加载完成之前发出的任何命令都会被缓冲,将在加载完成后执行。。
  • onload(可选):如果使用自动加载,这是在loadDatabase之后调用的处理程序。它接受一个错误参数。如果使用自动加载而没有指定此处理程序,如果在加载期间发生错误,将抛出一个错误。。
  • afterSerialization(可选):在数据序列化之后、写入磁盘之前,您可以使用该钩子函数来转换数据。例如,可用于在将数据库写入磁盘之前加密数据。此函数以字符串作为参数(NeDB 数据文件的一行)并输出转换后的字符串,该字符串绝对不能包含\n字符(否则数据将丢失)。
  • beforeDeserialization(可选): 在序列化之前执行。确保同时包含两者,否则可能导致数据丢失。NeDB会检查是否声明了其中一个而没有另一个,并尝试通过测试来防止数据丢失。
  • corruptAlertThreshold(可选):0 到 1 之间,默认为 10%。如果数据文件损坏的百分比超过此值,NeDB 将拒绝启动。0 表示您不能容忍任何损坏,1 表示不在乎。
  • compareStrings(可选):一个比较两个字符串的函数,返回-1、0或1。如果指定了此函数,它将覆盖默认的字符串比较,后者对于非美国字符(特别是重音字母)不太适用。
实例
const Datastore = require('nedb');  
  
// 创建一个新的数据库实例  
const db = new Datastore({   
    filename: './mydb.db', // 指定数据存储的文件位置  
    autoload: true // 自动加载数据库  
});

新增数据

​ 如果文档不包含_id字段,NeDB 将自动为您生成一个字段(16 个字符的字母数字字符串)。_id文档的字段一旦设置,就无法修改。

​ 字段名称不能以“$”开头或包含“。”。

// 插入数据  
const doc = { name: 'John Doe', age: 30 };  
db.insert(doc, function (err, newDoc) {  
    if (err) {  
        return console.error(err);  
    }  
    console.log('插入文档:', newDoc);  
});  

您还可以批量插入文档数组。此操作是原子性的,这意味着如果由于违反唯一约束而导致一次插入失败,则所有更改都会回滚。

db.insert([{ a: 5 }, { a: 42 }], function (err, newDocs) {
});

查询数据

基本查询

​ 基本查询是指查找字段与指定的字段匹配的文档。可以使用正则表达式来匹配字符串。也可以使用点符号在嵌套文档、数组、子文档数组中导航,并匹配数组的特定元素

let dataArr = [{ _id: 'id1', planet: 'Mars', system: 'solar', inhabited: false, satellites: ['Phobos', 'Deimos'] },
{ _id: 'id2', planet: 'Earth', system: 'solar', inhabited: true, humans: { genders: 2, eyes: true } },
{ _id: 'id3', planet: 'Jupiter', system: 'solar', inhabited: false },
{ _id: 'id4', planet: 'Omicron Persei 8', system: 'futurama', inhabited: true, humans: { genders: 7 } },
{ _id: 'id5', completeData: { planets: [ { name: 'Earth', number: 3 }, { name: 'Mars', number: 2 }, { name: 'Pluton', number: 9 } ] } }]
db.insert(dataArr,function (err,newDocs) {
  console.log("插入的测试数据:",newDocs)
})

// 查询system字段为solar的数据
db.find({ system: 'solar' }, function (err, docs) {
  // 如果没找到数据,则会返回[]
  console.log('找到的数据为:',docs)
});

// 使用正则匹配符合的数据
db.find({ planet: /ar/ }, function (err, docs) {
  console.log('找到的数据为:',docs)
});

// 多条件查询
db.find({ system: 'solar', inhabited: true }, function (err, docs) {
  console.log('找到的数据为:',docs)
});

// 查询对象数据,用.操作符
db.find({ "humans.genders": 2 }, function (err, docs) {
  console.log('找到的数据为:',docs)
});

// 查询所有数据
db.find({}, function (err, docs) {
  console.log('找到的数据为:',docs)
});

// 查询某条数据,返回对象类型数据
db.findOne({ _id: 'id1' }, function (err, doc) {
  console.log('找到的数据为:',doc)
});
运算符查询

$ne、$gt、$gte、$lt、$lte、$in、$nin、$or、$and、$not、$exists、$regex、$elemMatch

​ NeDB 提供了一些常用的运算符来支持各种查询需求。使用这些运算符,你可以构建复杂的查询条件,以满足不同的应用场景。在实际应用中,根据你的数据和需求选择合适的运算符,可以帮助你更高效地检索和处理数据。

// $ne(不等于):用于查找与指定值不相等的文档
db.find({ age: { $ne: 30 } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $gt(大于):用于查找某字段值大于指定值的文档
db.find({ age: { $gt: 25 } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $gte(大于或等于):用于查找某字段值大于或等于指定值的文档。
db.find({ age: { $gte: 30 } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $lt(小于):用于查找某字段值小于指定值的文档。
db.find({ age: { $lt: 30 } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $lte(小于或等于):用于查找某字段值小于或等于指定值的文档。
db.find({ age: { $lte: 30 } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $in(包含):用于查找字段值在指定数组中的文档。
db.find({ age: { $in: [25, 30, 35] } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $nin(不包含):用于查找字段值不在指定数组中的文档。
db.find({ age: { $nin: [25, 30, 35] } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $or(逻辑或):用于查找符合多个条件之一的文档。
db.find({ $or: [{ age: { $lt: 30 } }, { name: 'Alice' }] }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $and(逻辑与):用于查找同时符合多个条件的文档。注意:在 NeDB 中,$and 是默认的行为,因此通常可以省略。
db.find({ $and: [{ age: { $gte: 30 } }, { age: { $lte: 40 } }] }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $not(逻辑非):用于查找字段值不匹配指定条件的文档。
db.find({ $not: { age: { $gt: 30 } } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $exists(字段存在):用于查找指定字段存在的文档。
db.find({ age: { $exists: true } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $regex(正则表达式):用于查找字段值匹配正则表达式的文档。
db.find({ name: { $regex: /^A/ } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
// $elemMatch(数组中的元素匹配):用于查找数组字段中包含符合指定条件的元素的文档。
db.find({ tags: { $elemMatch: { $eq: 'important' } } }, function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
排序和分页

​ 在 NeDB 中,排序和分页可以通过查询结果的排序和限制文档数量来实现


// 使用 sort 方法来对查询结果进行排序。你可以根据字段和排序方向(升序或降序)来排序文档。
db.find({}).sort({ age: 1 }).exec(function (err, docs) {  // 升序排序
  if (err) throw err;
  console.log(docs);
});
db.find({}).sort({ age: -1 }).exec(function (err, docs) {
  if (err) throw err;
  console.log(docs);
});

// 分页可以通过 skip 和 limit 方法来实现。skip 方法用于跳过前面指定数量的文档,limit 方法用于限制返回的文档数量
db.find({}).sort({ age: 1 }).skip(1).limit(5).exec(function (err, docs) {
  if (err) throw err;
  console.log(docs);
});
``

计数查询

​ 使用count来统计文档数量。其语法与find相同

// 查询数量
db.count({}, function (err, count) {
  if (err) throw err;
  console.log(count)
});

更新数据

NeDB 提供了 update 方法来更新符合条件的文档。你可以指定更新的字段、更新方式以及匹配条件。update 方法的基本语法如下:

db.update(query, updateDoc, options, callback)
  • query: 更新条件,指定哪些文档需要被更新。
  • updateDoc: 更新文档,指定要更新的字段和值。
  • options: 更新选项,如是否替换整个文档、是否只更新第一条匹配的文档等。
  • callback: 操作完成后的回调函数,接收错误信息和更新的文档数量
更新单个文档

name张三 的文档中的 age 字段更新为 30

db.update({ name: '张三' }, { $set: { age: 30 } }, {}, function (err, numReplaced, affectedDocuments, upsert) {
  if (err) throw err;
  console.log('更新数量:', numReplaced);
});
  • $set 操作符用于设置指定字段的值。如果字段不存在,会添加该字段。
  • {}: 选项对象,这里是空对象,表示使用默认选项。
更新多个文档

将所有 name李四 的文档中的 age 字段更新为 30

db.update({ name: '李四' }, { $set: { age: 30 } }, {}, function (err, numReplaced, affectedDocuments, upsert) {
  if (err) throw err;
  console.log('更新数量:', numReplaced);
});
  • { multi: true }: 选项对象,表示更新所有匹配的文档,而不是只更新第一条匹配的文档。

删除数据

NeDB 提供了 remove 方法来删除符合条件的文档。你可以指定删除条件和选项。remove 方法的基本语法如下:

db.remove(query, options, callback)
  • query: 删除条件,指定哪些文档需要被删除。
  • options: 删除选项,如是否删除所有匹配的文档、是否只删除第一条匹配的文档等。
  • callback: 操作完成后的回调函数,接收错误信息和删除的文档数量。
删除单个文档

删除 name张三 的文档。

db.remove({ name: '张三' }, {}, function (err, numRemoved) {
  if (err) throw err;
  console.log('删除数量:', numRemoved);
});
删除多个文档

删除所有 age 小于 30的文档。

db.remove({ age: { $lt: 30 } }, { multi: true }, function (err, numRemoved) {
  if (err) throw err;
  console.log('删除数量:', numRemoved);
});
  • { multi: true }: 选项对象,表示删除所有匹配的文档,而不是只删除第一条匹配的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值