当我有一段恋情时,我正试图找到正确的方法在猫鼬中查询。
基本上我有一个文档,其中ObjectId与另一个文档相关(如下所示)。
但是当我尝试过滤参考的属性时,任何东西都不起作用了。 基本上,问题是这行“ .where({”Recipe.Title“:new RegExp(”*“)})”
// const configs
const config = require('./config');
// mongodb setup
const mongoose = require('mongoose');
mongoose.connect(config.database);
var Schema = mongoose.Schema
// recipe schema
const RecipeSchema = mongoose.Schema({
Title: { type: String },
Description: { type: String },
Complaints: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Complaint' }],
});
const Recipe = mongoose.model('Recipe', RecipeSchema);
// complaint schema
const ComplaintSchema = mongoose.Schema({
Recipe : { type: mongoose.Schema.Types.ObjectId, ref: 'Recipe' },
Message: { type: String }
});
const Complaint = mongoose.model('Complaint', ComplaintSchema);
/*
after inserting some items
*/
Complaint
.find()
.populate("Recipe")
.where({ "Recipe.Title": new RegExp("*") }) // this is not working!
.exec((error, items) => {
items.map((item) => {
console.log(item);
});
});
有人有正确的解决方法吗?
答案 0 :(得分:3)
(1)new RegExp("*")
似乎不是有效的正则表达式,因为*
是特殊的,意味着重复0次或更多次,例如a*
表示0个或更多a
个。
如果您尝试使用*
,则需要escape it:new RegExp('\\*')
(2)我认为你最好使用match(参见查询条件和其他选项)。
Complaint.find().populate({
path: "Recipe"
match: {
title: new RegExp('\\*')
}
}).exec(...);
虽然我相信这会引起所有投诉并填充那些与正则表达相匹配的食谱。
如果你真的只想要与正则表达式匹配的食谱投诉,你可能最好不要这样做。
Recipe.find({ title: new RegExp('\\*') }).populate('Complaints').exec(...)
或使用aggregation,您可以使用$lookup加入食谱集合,$match来过滤文档。
修改:我相信它会像
Complaint.aggregate([
// join Recipes collection
{
$lookup: {
from: 'Recipes',
localField: 'Recipe',
foreignField: '_id',
as: 'Recipe'
}
},
// convert array of Recipe to object
{
$unwind: '$Recipe'
},
// filter
{
$match: {
'Recipe.title': new RegExp('\\*')
}
}
]).exec(...)