mongo根据子文档字段过滤:
-- mongo查询子文档
db.table.aggregate([
{
$unwind:"$peoples" -- 查询子文档名
},
{
$match:{
"peoples.age":24, -- 子文档过滤条件,此处可用like,gt,lt等
"_id":"123" -- 此处可用in
}
},
{
$project:{
"_id":1,
"peoples.age":1,
"peoples.name":1, -- 定义需要返回的字段
dif:{
$eq:["peoples.city","peoples.province"] -- 此处可二次过滤
}
}
}
])
mongo分页查询:
-- mongoTemplate实现
Query query = new Query();
List<Object> infos = mongoTemplate.find(query.skip(skipNum).limit(limitNum),Object.class,tableName)
--mongo 查询
db.table.find().limit(100).skip(1000) -- limit 限制获取记录数量,skip跳过的记录数量
mongo分页,当数据量大时,skip关键字会导致查询性能变慢,分页查询修改思路:
只用limit关键字,查询结果添加排序,使用上次查询结果最大值作为查询条件
Query query = new Query();
if(首次进来) {
mongoTemplate.find(query.limit(limitNum).with(Sort.by("_id")),Object.class,tableName);
} else {
query.addCriteria(Criteria.where("_id").gt(lastTimeMaxId));
mongoTemplate.find(query.limit(limitNum).with(Sort.by("_id")),Object.class,tableName);
}
mongo查询总数:
Query query = new Query();
long count = mongoTemplate.count(query,tableName); -->数据量少的场景,如果数据量过大,直接用Count会导致查询超时
count = mongoTemplate.getCollection(tableName).estimatedDocumentCount(); --> 数据量大的场景