如何在 Mongoose 中搜索填充数组 [包含 ref 的数组]
How to search in Mongoose populate array [array containing ref]
我是 MEAN 堆栈开发的新手。请任何人告诉如何在 Mongoose 填充数组中搜索。该数组包含 ref.
讨论架构:
const discussionSchema = new Schema({
user_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
},
subject_title: {
type: String,
required: true
},
keywords: [
{
type: Schema.ObjectId,
ref: 'Keyword',
default: null
}
},
{
timestamps: true
}
)
关键字架构:
const keywordSchema = new Schema({
keyword:{
type: String,
required: true,
unique: true,
}
}, {
timestamps: true
})
如何在包含关键字模型的引用 ID 的关键字数组中搜索关键字字符串。
您可以使用 mongoose 聚合和 $lookup
运算符来实现此目的。 $lookup
用于加入 populate
.
等集合
您必须先加入讨论和关键字,然后使用 $match
运算符搜索关键字。
假设 matchingKeyword
变量是您的查询。
let result = await DiscussionModel.aggregate([{
$lookup: {
from: 'keywords',
localField: 'keywords',
foreignField: '_id',
as: 'keywords'
}
}, {
$match: {
'keywords.keyword': matchingKeyword
}
}]);
使用猫鼬种群的替代方法
await DiscussionModel.find('...')
.populate({ path: 'user_id', select: '...' })
.populate({
path: 'keywords',
match: { 'keyword': /regExp/ or 'exact match'}
}).lean().exec();
我是 MEAN 堆栈开发的新手。请任何人告诉如何在 Mongoose 填充数组中搜索。该数组包含 ref.
讨论架构:
const discussionSchema = new Schema({
user_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
},
subject_title: {
type: String,
required: true
},
keywords: [
{
type: Schema.ObjectId,
ref: 'Keyword',
default: null
}
},
{
timestamps: true
}
)
关键字架构:
const keywordSchema = new Schema({
keyword:{
type: String,
required: true,
unique: true,
}
}, {
timestamps: true
})
如何在包含关键字模型的引用 ID 的关键字数组中搜索关键字字符串。
您可以使用 mongoose 聚合和 $lookup
运算符来实现此目的。 $lookup
用于加入 populate
.
您必须先加入讨论和关键字,然后使用 $match
运算符搜索关键字。
假设 matchingKeyword
变量是您的查询。
let result = await DiscussionModel.aggregate([{
$lookup: {
from: 'keywords',
localField: 'keywords',
foreignField: '_id',
as: 'keywords'
}
}, {
$match: {
'keywords.keyword': matchingKeyword
}
}]);
使用猫鼬种群的替代方法
await DiscussionModel.find('...')
.populate({ path: 'user_id', select: '...' })
.populate({
path: 'keywords',
match: { 'keyword': /regExp/ or 'exact match'}
}).lean().exec();