Nodejs Mongoose怎么用一个 条件(value) 在多个字段(key)查询?

Nodejs Mongoose怎么用一个 条件(value) 在多个字段(key)查询?

var re = new RegExp(req.params.search, ‘i’);

app.User.find().or([{ ‘firstName’: { $regex: re }}, { ‘lastName’: { $regex: re }}]).sort(‘title’, 1).exec(function(err, users) { res.json(JSON.stringify(users)); });

例如以上代码,有更好的写法吗?


2 回复

当然可以!Mongoose 提供了多种方式来实现多字段查询。你提供的代码已经展示了如何使用 or 方法在多个字段上应用同一个条件。不过,我们可以通过一些改进使代码更简洁和易于理解。

示例代码

假设你有一个用户模型(User),并且你想在一个请求中根据用户的 firstNamelastName 进行模糊搜索:

const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({ firstName: String, lastName: String }));

// 假设这是从请求参数获取的搜索值
const searchValue = req.params.search;

// 创建正则表达式对象,忽略大小写
const regex = new RegExp(searchValue, 'i');

// 使用 $or 查询
User.find({
  $or: [
    { firstName: { $regex: regex } },
    { lastName: { $regex: regex } }
  ]
})
.sort('title', 1)
.exec((err, users) => {
  if (err) {
    return res.status(500).json({ error: 'An error occurred' });
  }
  res.json(JSON.stringify(users));
});

解释

  1. 创建正则表达式

    • new RegExp(searchValue, 'i') 创建了一个不区分大小写的正则表达式对象。'i' 表示忽略大小写。
  2. 使用 $or 查询

    • User.find({ $or: [ ... ] }) 方法允许你在多个字段上进行 OR 操作。这里我们检查 firstNamelastName 是否匹配正则表达式。
  3. 排序

    • .sort('title', 1) 对结果进行排序。1 表示升序排序,-1 表示降序排序。
  4. 执行查询

    • .exec() 方法执行查询,并将结果传递给回调函数。如果发生错误,返回一个 500 错误响应;如果没有错误,则返回查询结果。

这种方法不仅简洁,而且更易于维护和扩展。你可以轻松地添加更多的字段到 $or 查询中,而不需要重复代码。


对于你的问题,你可以使用Mongoose的$or操作符来在一个条件(value)下对多个字段(key)进行查询。你的例子已经很接近了,但为了更好地理解和优化代码,可以做一些调整。

// 使用正则表达式创建搜索条件
const searchValue = new RegExp(req.params.search, 'i'); // 'i' 表示不区分大小写

// 构建查询条件
const queryConditions = [
    { firstName: { $regex: searchValue } },
    { lastName: { $regex: searchValue } }
];

// 使用 .or() 方法查询
User.find().or(queryConditions).sort({ title: 1 }).exec((err, users) => {
    if (err) return res.status(500).send(err);
    res.json(JSON.stringify(users));
});

解释:

  1. 正则表达式:我们创建了一个正则表达式对象 searchValue,它用于不区分大小写的搜索。
  2. 构建查询条件:将需要搜索的字段和对应的正则表达式放入数组 queryConditions 中。
  3. 执行查询:使用 .or() 方法执行查询,该方法接受一个包含多个查询条件的数组,并返回满足任一条件的结果。
  4. 排序.sort({ title: 1 }) 表示按 title 字段升序排序结果。

这种写法更清晰且易于维护,也符合Mongoose的最佳实践。

回到顶部