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,
},
};
欢迎下载,欢迎给 Star 嘿嘿
npm i mongoose-find-by-reference
针对您提到的Node.js Mongoose插件推广,直接搜索ref: 'xxx'
属性的需求,通常可以通过Mongoose的虚拟属性、查询中间件或者自定义查询方法来实现。这里提供一个简单的自定义查询方法示例,来展示如何实现对引用属性的直接搜索。
首先,假设我们有两个模型:User
和Post
,其中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的查询链式调用风格。
希望这个示例能对您有所帮助!