Mongoose如何加入搜索结果

时间:2015-12-07 04:25:14

标签: node.js mongodb express mongoose

我的文章模型定义如下:

var ArticleSchema = new Schema({
    type: String
    ,title: String
    ,content: String
    ,hashtags: {
        type: [String]
        ,index: true
    }

    ,meta: {
        tags: [String] //anything
        ,category: String
    }

现在我需要按类别,按标签和关键字进行搜索。

    var words = queryString.split(' ')

    if (searchType === constant.searchTypes.category) {
        criteria['meta.category'] = {$in: words}
    }
    else if (searchType === constant.searchTypes.tag) {
        //todo
    }
    else if (searchType === constant.searchTypes.keyword) {
        //todo
    }

    var query = Article.find(criteria)
    helper.populateCommonFieldsForQuery(query)
    query.exec(function(err, articles) {
        if (err)
            return next(err)
        return res.json(articles)
    })

queryString只是'word1 word2 word3'格式。按类别搜索很容易,因为一篇文章只有一个类别。我可以简单地使用$ in premise。

但文章有多个标签,我想列出所有文章,其中任何一个标签都匹配任何查询单词(即设置交叉不为空)

此外,我需要按关键字搜索,我需要检查标题或内容匹配。我可以在一个查询中执行此操作吗?

1 个答案:

答案 0 :(得分:0)

criteria['meta.tags'] = {$in: words}表达式也可用于tags$or运算符可用于查询标题和内容值 MongoDB官方文档:https://docs.mongodb.org/manual/reference/operator/query/

实际上这个问题对我来说并不清楚。 searchTypes有条件。 如果条件不是,我会更喜欢下面的代码(我没有测试它);

var words = queryString.split(' ')
var criteria = $or[
    { 'meta.category': {$in: words} },
    { 'meta.tags': {$in: words} },
    { title: {$in: words} },
    { content: {$in: words} },
]
var query = Article.find(criteria)
helper.populateCommonFieldsForQuery(query)
query.exec(function(err, articles) {
    if (err)
        return next(err)
    return res.json(articles)
})

不应跳过索引所有查询字段的索引。

祝你好运。