Mongoose 聚合查询

本贴最后更新于 1920 天前,其中的信息可能已经东海扬尘

Author 模型

const mongoose = require('mongoose') const moment = require('moment') const Schema = mongoose.Schema const AuthorSchema = new Schema( { first_name: { type: String, required: true, max: 100 }, family_name: { type: String, required: true, max: 100 }, date_of_birth: { type: Date }, date_of_death: { type: Date } }, { toJSON: { virtuals: true } } ) module.exports = mongoose.model('Author', AuthorSchema)

数据集

{ "RECORDS": [ { "_id": "5deb0af03e15fb05116733f9", "first_name": "Isaac", "family_name": "Asimov" }, { "_id": "5deb0af03e15fb05116733f7", "first_name": "迅", "family_name": "鲁" }, { "_id": "5deb0af03e15fb05116733f8", "first_name": "言", "family_name": "莫" }, { "_id": "5deb0af03e15fb05116733f6", "first_name": "笑笑生", "family_name": "兰陵" }, { "_id": "5deb0af03e15fb05116733f5", "first_name": "迁", "family_name": "司马" }, { "_id": "5df25414c9d219055b41f833", "first_name": "金", "family_name": "巴" }, { "_id": "5df25439c9d219055b41f834", "first_name": "立波", "family_name": "周" }, { "_id": "5df25449c9d219055b41f835", "first_name": "蒙", "family_name": "王" }, { "_id": "5df2544fc9d219055b41f836", "first_name": "朔", "family_name": "王" }, { "_id": "5df2546ac9d219055b41f837", "first_name": "土", "family_name": "王" } ] }

需求

根据作者姓名进行查询,即 family_name+first_name

mongodb 聚合查询命令

db.authors.aggregate([ { $project: { name: { $concat: ['$family_name', '$first_name'] } } }, { $match: { $or: [{ name: { $regex: new RegExp('王', 'i') } }] } }, { $skip: 0 }, { $limit: 10 } ])

输出

[ { "_id": ObjectId("5df25449c9d219055b41f835"), "name": "王蒙" }, { "_id": ObjectId("5df2544fc9d219055b41f836"), "name": "王朔" }, { "_id": ObjectId("5df2546ac9d219055b41f837"), "name": "王土" } ]

mongoose 查询方式

// query = { name: '王' } exports.listName = query => { return new Promise((resolve, reject) => { let { name, page, limit } = query console.log(query) page = page ? page : 1 limit = limit ? limit : 100 let match = {} let like = [] if (name) { like.push({ name: { $regex: new RegExp(name, 'i') } }) match.$or = like } Author.aggregate([ { $project: { name: { $concat: ['$family_name', '$first_name'] } } }, { $match: match }, { $skip: +(page - 1) * limit }, { $limit: +limit } ]).exec((err, result) => { if (err) { return reject(err) } resolve({ items: result }) }) }) }

输出

{ items: [ { _id: 5df25449c9d219055b41f835, name: '王蒙' }, { _id: 5df2544fc9d219055b41f836, name: '王朔' }, { _id: 5df2546ac9d219055b41f837, name: '王土' } ] }

参考

选择记录匹配 MongoDB 中两个字段的 concat 值
Aggregation

  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone1764 via Linux

    为什么条件那里要用正则匹配呢?姓不是都是一个字吗?

    1 回复
  • JoeysCat via macOS
    作者

    咱不是还有复姓嘛

    估计你也用不上了,不好意思哈

    1 回复
  • someone1764 via Ubuntu

    原来如此,我考虑不周了