Nodejs Mongoose 插件推广:支持直接搜索 ref:'xxx' 的属性

Nodejs Mongoose 插件推广:支持直接搜索 ref:‘xxx’ 的属性

相信不少使用 Mongoose 的朋友都遇到过,想要在对参考字段的值进行搜索。

参考字段,也就是类似这样的字段:

{
    type: MongooseSchema.Types.ObjectId,
    ref: 'XXX',
  }

例如我们有 Cat 这个 Model ,它有 sex (性别)、parents (父母)和 owner (主人)三个属性,ref 分别是 'Cat' 和 'Person'; Person 则有 name (名字)一个属性。

然后我们想要查询性别为女、父母的主人名字是 'Dean' 的猫,我们可能会这么写:

const result = await catModel
  .find({
    $and: {
      parents: {
        'owner.name': 'Dean',
      },
      sex: 0,
    },
  })
  .exec();

但我们知道,这样只会报错。因为 parents 此刻是 ObjectId ,populate 是 Mongoose 的功能,不是 MongoDB 的。

假设使用 MongoDB 的 $lookup 呢,又麻烦,又丧失了 Mongoose 的不少便捷功能。

假设构建一个 method ,手动把搜索条件替换成符合搜索条件的 ObjectId 数组,又得特事特办,很麻烦。

所以,不如现在来使用 MongooseFindByReference 模块,它会自动把对参考字段的搜索,替换成符合搜索条件的 ObjectId 数组。

使用后,搜索条件就会被替换成:

const oldConditions = {
    $and: {
      parents: {
        'owner.name': 'Dean',
      },
      sex: 0,
    },
  };

const newConditions = { $and: { parents: { $in: [/* 符合条件的猫的 ObjectId 数组 */], }, sex: 0, }, };

NPM 链接 Github 链接

欢迎下载,欢迎给 Star 嘿嘿

npm i mongoose-find-by-reference

1 回复

针对您提到的Node.js Mongoose插件推广,直接搜索ref: 'xxx'属性的需求,通常可以通过Mongoose的虚拟属性、查询中间件或者自定义查询方法来实现。这里提供一个简单的自定义查询方法示例,来展示如何实现对引用属性的直接搜索。

首先,假设我们有两个模型:UserPost,其中Post引用User

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
});

const postSchema = new mongoose.Schema({
  content: String,
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
});

// 自定义查询方法
postSchema.query.byUserName = function(name) {
  return this.populate({
    path: 'user',
    match: { name: name },
    select: 'name' // 可选,指定返回的字段
  }).exec();
};

const User = mongoose.model('User', userSchema);
const Post = mongoose.model('Post', postSchema);

// 使用示例
Post.byUserName('John Doe').then(posts => console.log(posts));

在这个示例中,我们为Post模型添加了一个自定义查询方法byUserName,该方法通过populate来搜索引用User中名字匹配的记录。这种方法虽然不是直接搜索ref: 'xxx'属性,但实现了通过引用属性相关字段进行搜索的需求,且保持了Mongoose的查询链式调用风格。

希望这个示例能对您有所帮助!

回到顶部