按照猫鼬中的引用属性进行过滤

时间:2017-07-25 19:18:13

标签: mongodb mongoose

当我有一段恋情时,我正试图找到正确的方法在猫鼬中查询。

基本上我有一个文档,其中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);
        });
    });

有人有正确的解决方法吗?

1 个答案:

答案 0 :(得分:3)

(1)new RegExp("*")似乎不是有效的正则表达式,因为*是特殊的,意味着重复0次或更多次,例如a*表示0个或更多a个。

如果您尝试使用*,则需要escape itnew 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(...)