Mongoose是一个流行的JavaScript库,该库与NOSQL数据库MongoDB一起使用。它提供了一种从Node.js应用程序与MongoDB互动的优雅和用户友好的方式。 Mongoose提供了几个关键好处:
-
基于架构的建模:Mongoose允许您为MongoDB集合定义数据模式,执行数据结构和验证。这确保了数据一致性和完整性。
-
易于数据操作:通过提供直观的方法来创建,读取,更新,删除文档。
来简化CRUD操作。
-
验证:Mongoose提供内置验证功能,使您可以定义数据验证规则,以确保仅存储有效的数据。
-
中间件:您可以定义中间件功能以在特定操作之前或之后执行自定义逻辑,例如保存或查询数据。
-
查询构建:Mongoose提供了一个强大的查询构建器,并支持过滤,分类和分页,从而更容易构造复杂的数据库查询。
-
人口:蒙古简化了数据参考和人口,使您可以从单个查询中的其他收藏集中检索相关数据。
-
中间件支持:它支持中间件功能在文档验证,保存和其他操作期间执行自定义逻辑。
-
插件:Mongoose提供了一个插件系统,可让您轻松扩展其功能并在项目中重复使用代码。
总的来说,猫鼬的流线杂志互动,使其成为node.js开发人员的流行选择。它提高了发展效率并确保基于mongoDB的应用程序中的数据一致性和验证。
这是一些简单CRUD操作的示例查询:
插入文档:
创建并将新文档插入MongoDB集合中。
const newBook = new Book({ title: "'Sample Book', author: 'John Doe' });"
newBook.save();
找到所有文档:
从集合中检索所有文档。
const allBooks = await Book.find();
查找条件的文档:
检索与特定条件相匹配的文档。
const fantasyBooks = await Book.find({ genre: 'Fantasy' });
找到一个文档:
根据条件检索单个文档。
const book = await Book.findOne({ title: "'Sample Book' });"
更新文档:
更新文档的字段。
await Book.updateOne({ title: "'Sample Book' }, { $set: { genre: 'Science Fiction' } });"
删除文档:
根据条件删除文档。
await Book.deleteOne({ title: "'Sample Book' });"
汇总数据:
使用聚合管道执行数据聚合操作。
const result = await Book.aggregate([
{ $match: { genre: 'Science Fiction' } },
{ $group: { _id: '$author', totalBooks: { $sum: 1 } } }
]);
排序文档:
根据字段对文档进行排序。
const sortedBooks = await Book.find().sort({ title: "1 }); // Ascending order"
限制和跳过结果:
限制返回的文档数量并跳过一些结果。
const page1 = await Book.find().skip(0).limit(10); // First 10 documents
const page2 = await Book.find().skip(10).limit(10); // Next 10 documents
填充参考:
填充文档,带有来自其他收藏的参考文献。
const user = await User.findOne().populate('books'); // Assuming 'books' is a reference field
示例用于构建搜索API的Mongoose查询:
基本文本搜索:
搜索字段中包含特定文本的文档。
const searchQuery = 'apple';
const results = await Product.find({ $text: { $search: searchQuery } });
案例不敏感的搜索:
执行不敏感的文本搜索。
const searchQuery = 'apple';
const results = await Product.find({
productName: { $regex: new RegExp(searchQuery, 'i') }
});
通过多个条件进行搜索:
使用$and
或$or
操作员组合多个搜索条件。
const searchQuery1 = 'apple';
const searchQuery2 = 'red';
const results = await Product.find({
$or: [
{ productName: { $regex: new RegExp(searchQuery1, 'i') } },
{ color: { $regex: new RegExp(searchQuery2, 'i') } }
]
});
按日期搜索:
在特定日期范围内搜索文档。
const startDate = new Date('2023-01-01');
const endDate = new Date('2023-12-31');
const results = await Event.find({
eventDate: { $gte: startDate, $lte: endDate }
});
部分匹配搜索:
搜索字段部分匹配搜索查询的文档。
const searchQuery = 'app';
const results = await Product.find({
productName: { $regex: new RegExp(searchQuery, 'i') }
});
与分页搜索:
实施分页以进行搜索结果。
const page = 1;
const perPage = 10;
const skip = (page - 1) * perPage;
const results = await Product.find({}).skip(skip).limit(perPage);
排序搜索结果:
根据字段对搜索结果进行排序。
const sortBy = 'price'; // Field to sort by
const sortOrder = 'asc'; // 'asc' or 'desc'
const results = await Product.find({}).sort({ [sortBy]: sortOrder });
使用全文索引和加权搜索:
对某些字段进行加权进行全文搜索。
const searchQuery = 'apple';
const results = await Product.find({
$text: { $search: searchQuery },
$meta: { $textScore: { $gte: 1 } }
}).sort({ score: { $meta: 'textScore' } });
通过数组元素搜索:
搜索在数组字段中包含特定元素的文档。
const searchQuery = 'red';
const results = await Product.find({ colors: searchQuery });
搜索正则表达式:
搜索使用正则表达式匹配字段的文档。
const searchQuery = '^abc';
const results = await Product.find({ productName: { $regex: searchQuery } });
样品杂种汇总查询以执行复杂的数据转换和计算:
组和计数文档:
通过字段进行组文档并计算出事件。
const result = await Order.aggregate([
{ $group: { _id: '$product', count: { $sum: 1 } } }
]);
计算平均值:
计算数字字段的平均值。
const result = await Product.aggregate([
{ $group: { _id: null, avgPrice: { $avg: '$price' } } }
]);
过滤器和组:
过滤文档,然后将它们分组。
const result = await Transaction.aggregate([
{ $match: { status: 'completed' } },
{ $group: { _id: '$product', total: { $sum: '$amount' } } }
]);
排序和限制:
对文档进行排序并限制结果集。
const result = await Product.aggregate([
{ $sort: { price: -1 } },
{ $limit: 5 }
]);
放松阵列:
放开一个数组字段,为每个数组元素创建单独的文档。
const result = await Order.aggregate([
{ $unwind: '$items' }
]);
项目特定字段:
要在结果中包括项目特定字段。
const result = await User.aggregate([
{ $project: { name: 1, email: 1 } }
]);
查找和填充:
执行查找操作以加入另一个集合的数据。
const result = await Order.aggregate([
{
$lookup: {
from: 'products',
localField: 'productId',
foreignField: '_id',
as: 'product'
}
}
]);
日期聚合:
按日期提取和分组数据。
const result = await Log.aggregate([
{
$group: {
_id: { $dateToString: { format: '%Y-%m-%d', date: '$timestamp' } },
count: { $sum: 1 }
}
}
]);
有条件汇总:
基于场值执行条件聚合。
const result = await Sales.aggregate([
{
$group: {
_id: '$product',
totalSales: {
$sum: {
$cond: [{ $eq: ['$status', 'sold'] }, '$quantity', 0]
}
}
}
}
]);
铲斗数据:
将数据数据存入预定义的范围。
const result = await Product.aggregate([
{
$bucket: {
groupBy: '$price',
boundaries: [0, 100, 200, 300],
default: 'Other',
output: {
count: { $sum: 1 },
avgPrice: { $avg: '$price' }
}
}
}
]);