我为每个帖子都有一个评论模型,
const CommentSchema = new mongoose.Schema({
author: { type: ObjectID, required: true, ref: 'User' },
thread: { type: ObjectID, required: true, ref: 'Thread' },
parent: { type: ObjectID, required: true, ref: 'Comment' },
text: { type: String, required: true },
}, {
timestamps: true,
});
除了_id
的单个查询外,我想通过这种方式查询数据库:
范围查询
const query = {
thread: req.query.threadID,
_id: { $gt: req.query.startFrom }
};
CommentModel.find(query).limit(req.query.limit);
我的目的是找到与线程相关的注释,然后获取结果的一部分。看来这个查询按预期工作。我的问题是:
这是满足我要求的正确方法吗?
如何正确索引字段?这是一个复合索引还是我需要分别索引每个字段?我检查了explain()
的结果,只要其中一个查询字段包含索引,inputStage.stage
将始终包含IXSCAN
而不是COLLSCAN
?这是检查查询性能的关键信息吗?
这是否意味着每次我需要根据一个字段查找时,我需要为这些字段制作索引?让我们说我想搜索作者发布给特定帖子的所有评论。
这样的代码:
const query = {
thread: req.query.threadID,
author: req.query.authorID,
};
我是否需要为此要求创建复合索引?
答案 0 :(得分:1)
如果您想通过多个字段进行查询,则必须创建复合索引。
例如
const query = {
thread: req.query.threadID,
author: req.query.authorID,
};
如果您想使用此查询,则必须创建复合索引,如:
db.comments.createIndex( { "thread": 1, "author": 1 } );
然后,索引支持对项目字段以及项目和库存字段的查询:
db.comments.find( { thread: "threadName" } )
db.comments.find( { thread: "threadName", author: "authorName" }
但不支持这个
db.comments.find( { author: "authorName", thread: "threadName" }
如果你为{ "thread": 1, "author": 1, "parent": 1 }
创建索引,那么对于下面的命令查询支持索引
thread
字段,
thread
字段和author
字段
thread
字段和author
字段以及parent
字段。
但不支持以下命令
author
字段,
parent
字段或
author
和parent
字段。