在NoSQL的学习过程中,数据的创建与读取是最基础也最常用的操作,很多初学者刚从关系型数据库转过来时,往往会因为语法的差异感到困惑。接下来我们就以MongoDB为例,一步步讲解NoSQL中这两类操作的实现方式。

NoSQL数据创建操作
NoSQL的创建操作对应传统SQL里的INSERT语句,不过因为NoSQL大多采用文档、键值对这类灵活的存储结构,语法会和SQL有明显区别。以MongoDB为例,我们使用insertOne和insertMany方法来实现数据插入。
单条数据创建
插入单条数据时,我们需要先连接到对应的数据库和集合,再执行插入操作,具体代码如下:
// 连接MongoDB数据库,地址为本地默认端口
const { MongoClient } = require('mongodb');
const url = 'mongodb://127.0.0.1:27017';
const client = new MongoClient(url);
async function insertSingleData() {
try {
await client.connect();
// 选择test数据库,users集合
const database = client.db('test');
const collection = database.collection('users');
// 要插入的单条用户数据
const userData = {
name: '张三',
age: 25,
hobby: ['篮球', '阅读'],
register_time: new Date()
};
// 执行单条插入操作
const result = await collection.insertOne(userData);
console.log('单条数据插入成功,插入的文档ID为:', result.insertedId);
} finally {
await client.close();
}
}
insertSingleData().catch(console.error);多条数据创建
如果需要一次性插入多条数据,可以使用insertMany方法,传入一个数组即可,示例代码如下:
async function insertMultiData() {
try {
await client.connect();
const database = client.db('test');
const collection = database.collection('users');
// 要插入的多条用户数据
const userList = [
{ name: '李四', age: 22, hobby: ['足球'], register_time: new Date() },
{ name: '王五', age: 28, hobby: ['编程', '跑步'], register_time: new Date() },
{ name: '赵六', age: 24, hobby: ['摄影'], register_time: new Date() }
];
const result = await collection.insertMany(userList);
console.log('多条数据插入成功,插入的文档ID列表为:', result.insertedIds);
} finally {
await client.close();
}
}
insertMultiData().catch(console.error);NoSQL数据读取操作
NoSQL的读取操作对应传统SQL里的SELECT语句,可以实现全量查询、条件查询、排序、分页等常见需求,同样以MongoDB为例,核心使用find方法来实现。
全量数据读取
如果需要查询集合中的所有数据,可以不传入查询条件,直接调用find方法,代码如下:
async function readAllData() {
try {
await client.connect();
const database = client.db('test');
const collection = database.collection('users');
// 查询所有数据,toArray转为数组形式返回
const allUsers = await collection.find().toArray();
console.log('所有用户数据:', allUsers);
} finally {
await client.close();
}
}
readAllData().catch(console.error);条件数据读取
实际开发中更多是需要按条件查询数据,比如查询年龄大于24岁的用户,或者爱好包含编程的用户,示例代码如下:
async function readDataByCondition() {
try {
await client.connect();
const database = client.db('test');
const collection = database.collection('users');
// 条件1:年龄大于24岁的用户
const ageCondition = { age: { $gt: 24 } };
const ageUsers = await collection.find(ageCondition).toArray();
console.log('年龄大于24岁的用户:', ageUsers);
// 条件2:爱好包含编程的用户,$in用于匹配数组中包含指定元素的文档
const hobbyCondition = { hobby: { $in: ['编程'] } };
const hobbyUsers = await collection.find(hobbyCondition).toArray();
console.log('爱好包含编程的用户:', hobbyUsers);
} finally {
await client.close();
}
}
readDataByCondition().catch(console.error);和传统SQL操作的对比
为了帮助大家更好理解NoSQL的创建和读取操作,我们整理了和传统MySQL操作的对比表格:
| 操作类型 | MySQL(关系型数据库) | MongoDB(NoSQL数据库) |
|---|---|---|
| 单条创建 | INSERT INTO users (name, age) VALUES ('张三', 25); | collection.insertOne({ name: '张三', age: 25 }) |
| 多条创建 | INSERT INTO users (name, age) VALUES ('李四', 22), ('王五', 28); | collection.insertMany([{ name: '李四', age: 22 }, { name: '王五', age: 28 }]) |
| 全量读取 | SELECT * FROM users; | collection.find().toArray() |
| 条件读取 | SELECT * FROM users WHERE age > 24; | collection.find({ age: { $gt: 24 } }).toArray() |
需要注意的是,不同NoSQL产品的操作语法会有差异,比如Redis的创建和读取操作就和MongoDB完全不同,Redis使用SET命令创建键值对,使用GET命令读取对应的值,学习者需要根据自己使用的NoSQL产品对应学习相关语法。