我的文章模型定义如下:
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。
但文章有多个标签,我想列出所有文章,其中任何一个标签都匹配任何查询单词(即设置交叉不为空)
此外,我需要按关键字搜索,我需要检查标题或内容匹配。我可以在一个查询中执行此操作吗?
答案 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)
})
不应跳过索引所有查询字段的索引。
祝你好运。