MongoDB是一款基于文档型的NoSQL数据库,数据存储形式为BSON格式,和传统关系型数据库相比,它的 schema 设计更灵活,适合处理非结构化或者半结构化数据。插入和查询是MongoDB最基础也最常用的操作,掌握这两个操作是使用MongoDB的第一步。

环境准备
操作前需要确保已经安装并启动了MongoDB服务,同时安装了对应语言的MongoDB驱动,本文示例使用Node.js的官方驱动mongodb作为演示,其他语言的操作逻辑基本一致,只是语法略有差异。
初始化连接
首先建立与MongoDB的连接,选择要操作的数据库和集合:
const { MongoClient } = require('mongodb');
// 连接字符串,本地默认端口为27017
const url = 'mongodb://127.0.0.1:27017';
const client = new MongoClient(url);
async function init() {
await client.connect();
// 选择数据库,若不存在会自动创建
const db = client.db('test_db');
// 选择集合,若不存在会自动创建
const collection = db.collection('user_collection');
return collection;
}
插入数据操作
MongoDB的插入操作分为单条插入和批量插入两种,插入的数据不需要提前定义字段结构,同一个集合中可以存储不同结构的文档。
单条插入
使用insertOne方法可以插入单条文档,返回结果包含插入的确认信息和生成的_id值:
async function insertSingleData() {
const collection = await init();
const user = {
name: '张三',
age: 25,
hobby: ['篮球', '阅读'],
create_time: new Date()
};
const result = await collection.insertOne(user);
console.log('插入成功,插入的文档_id为:', result.insertedId);
await client.close();
}
insertSingleData();
批量插入
如果需要插入多条数据,使用insertMany方法效率更高,传入一个文档数组即可:
async function insertManyData() {
const collection = await init();
const userList = [
{ name: '李四', age: 22, hobby: ['足球'], create_time: new Date() },
{ name: '王五', age: 28, hobby: ['编程', '跑步'], create_time: new Date() },
{ name: '赵六', age: 30, city: '北京' } // 该文档无hobby字段,体现MongoDB的schema灵活性
];
const result = await collection.insertMany(userList);
console.log('批量插入成功,插入的文档数量为:', result.insertedCount);
await client.close();
}
insertManyData();
查询数据操作
MongoDB的查询操作通过find方法实现,支持多种查询条件,默认返回集合中所有文档。
查询所有数据
不传入查询条件时,find会返回集合中的全部文档,需要使用toArray方法将游标转换为数组:
async function findAllData() {
const collection = await init();
const allUsers = await collection.find().toArray();
console.log('所有用户数据:', allUsers);
await client.close();
}
findAllData();
条件查询
可以在find方法的第一个参数中传入查询条件,支持等值匹配、范围查询、逻辑运算等多种条件:
| 查询场景 | 查询条件示例 | 说明 |
|---|---|---|
| 等值匹配 | { name: '张三' } | 查询name字段等于张三的文档 |
| 范围查询 | { age: { $gt: 25 } } | 查询age大于25的文档,$gt表示大于,$lt表示小于,$gte大于等于,$lte小于等于 |
| 包含查询 | { hobby: '篮球' } | 查询hobby数组中包含篮球的文档 |
| 逻辑或查询 | { $or: [{ age: { $lt: 25 } }, { name: '王五' }] } | 查询age小于25或者name是王五的文档 |
以下是条件查询的代码示例:
async function findWithCondition() {
const collection = await init();
// 查询age大于25的用户
const adultUsers = await collection.find({ age: { $gt: 25 } }).toArray();
console.log('年龄大于25的用户:', adultUsers);
// 查询hobby包含篮球的用户
const basketballUsers = await collection.find({ hobby: '篮球' }).toArray();
console.log('喜欢篮球的用户:', basketballUsers);
await client.close();
}
findWithCondition();
投影查询
默认查询会返回文档的所有字段,如果只需要返回指定字段,可以在find的第二个参数中配置投影,1表示返回该字段,0表示不返回:
async function findWithProjection() {
const collection = await init();
// 只返回name和age字段,不返回_id和其他字段
const result = await collection.find(
{ age: { $gte: 20 } },
{ projection: { name: 1, age: 1, _id: 0 } }
).toArray();
console.log('投影查询结果:', result);
await client.close();
}
findWithProjection();
操作注意事项
- 插入数据时如果没有指定
_id字段,MongoDB会自动生成一个唯一的ObjectId作为文档标识,不建议手动修改这个值。 - 查询条件中的字段名需要和插入时的字段名完全一致,MongoDB的查询是区分大小写的,比如
Name和name是不同的字段。 - 批量插入时如果其中一条数据插入失败,默认情况下已经插入的数据不会回滚,需要根据业务需求处理失败场景。
- 对于大数据量的查询,建议配合
limit方法限制返回数量,避免一次性加载过多数据导致内存占用过高。
MongoDBinsertfindNoSQL_database修改时间:2026-06-18 03:12:40