Mongoose 聚合查询

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

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 模型而得以轻量和高效。

    131 引用 • 258 回帖 • 548 关注
  • MongoDB

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

    82 引用 • 53 回帖 • 2 关注

广告 我要投放

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • mymoshou

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

    1 回复
  • JoeysCat
    作者

    咱不是还有复姓嘛

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

    1 回复
  • mymoshou

    原来如此,我考虑不周了