mongo查询总结

对foo 添加元素:
 for(i=1;i<=10;i++){
	db.foo.insert({name:'wxz'+i,age:i});
 }
 
 查看数据:
 db.foo.find() 
{ "_id" : ObjectId("5deaa110b636150f1bc3e7cf"), "name" : "wxz1", "age" : 1 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d0"), "name" : "wxz2", "age" : 2 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d1"), "name" : "wxz3", "age" : 3 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d2"), "name" : "wxz4", "age" : 4 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d3"), "name" : "wxz5", "age" : 5 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d4"), "name" : "wxz6", "age" : 6 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d5"), "name" : "wxz7", "age" : 7 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d6"), "name" : "wxz8", "age" : 8 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d7"), "name" : "wxz9", "age" : 9 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d8"), "name" : "wxz10", "age" : 10 }

$in 的使用
查询age为 1,5,7 的数据
db.foo.find({age:{'$in':[1,5,7]}})
{ "_id" : ObjectId("5deaa110b636150f1bc3e7cf"), "name" : "wxz1", "age" : 1 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d3"), "name" : "wxz5", "age" : 5 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d5"), "name" : "wxz7", "age" : 7 }

 
$nin 的使用
查询age不是 1,5,7 的数据
db.foo.find({age:{'$nin':[1,5,7]}})
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d0"), "name" : "wxz2", "age" : 2 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d1"), "name" : "wxz3", "age" : 3 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d2"), "name" : "wxz4", "age" : 4 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d4"), "name" : "wxz6", "age" : 6 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d6"), "name" : "wxz8", "age" : 8 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d7"), "name" : "wxz9", "age" : 9 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d8"), "name" : "wxz10", "age" : 10 }

$or 的使用
查询name是 wxz2 或  wxz5 的数据
db.foo.find({$or:[{'name':'wxz2'},{name:'wxz5'}]})
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d0"), "name" : "wxz2", "age" : 2 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d3"), "name" : "wxz5", "age" : 5 }

$nor 的使用
不要name 是 wxz2 和 wxz5 的数据
db.foo.find({$nor:[{name:'wxz2'},{'name':'wxz5'}]});
{ "_id" : ObjectId("5deaa110b636150f1bc3e7cf"), "name" : "wxz1", "age" : 1 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d1"), "name" : "wxz3", "age" : 3 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d2"), "name" : "wxz4", "age" : 4 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d4"), "name" : "wxz6", "age" : 6 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d5"), "name" : "wxz7", "age" : 7 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d6"), "name" : "wxz8", "age" : 8 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d7"), "name" : "wxz9", "age" : 9 }
{ "_id" : ObjectId("5deaa110b636150f1bc3e7d8"), "name" : "wxz10", "age" : 10 }





db.createCollection('c2')
db.c2.insert({name:'wxz1',post:[1,2,3,4,5]})
db.c2.insert({name:'wxz2',post:[6,7,8,9,10]})
db.c2.insert({name:'wxz3',post:[4,5,6,9,10]})
db.c2.insert({name:'wxz4',post:[9,10]})
db.c2.insert({name:'wxz5',post:[9,10,11]})


$size
查询 post 集合数量为3的数据
db.c2.find({post:{$size:3}})
{ "_id" : ObjectId("5deaa528b636150f1bc3e7dd"), "name" : "wxz5", "post" : [ 9, 10, 11 ] }

$where 
查询name 是wxz1 或 wxz2的数据
db.c2.find({$where:function(){return this.name=='wxz1'|| this.name=='wxz2'}});
{ "_id" : ObjectId("5deaa4f5b636150f1bc3e7d9"), "name" : "wxz1", "post" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : ObjectId("5deaa50ab636150f1bc3e7da"), "name" : "wxz2", "post" : [ 6, 7, 8, 9, 10 ] }

添加一条数据
db.c2.insert({name:'WXz2',post:[1,2,3]})
//的使用
查询 name 中包含 wxz 的数据
db.c2.find({name:/wxz/})
{ "_id" : ObjectId("5deaa4f5b636150f1bc3e7d9"), "name" : "wxz1", "post" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : ObjectId("5deaa50ab636150f1bc3e7da"), "name" : "wxz2", "post" : [ 6, 7, 8, 9, 10 ] }
{ "_id" : ObjectId("5deaa516b636150f1bc3e7db"), "name" : "wxz3", "post" : [ 4, 5, 6, 9, 10 ] }
{ "_id" : ObjectId("5deaa51eb636150f1bc3e7dc"), "name" : "wxz4", "post" : [ 9, 10 ] }
{ "_id" : ObjectId("5deaa528b636150f1bc3e7dd"), "name" : "wxz5", "post" : [ 9, 10, 11 ] }
//i 的使用(忽略大小写)
查询 name 中包含 wxz 的数据
db.c2.find({name:/wxz/i})
{ "_id" : ObjectId("5deaa4f5b636150f1bc3e7d9"), "name" : "wxz1", "post" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : ObjectId("5deaa50ab636150f1bc3e7da"), "name" : "wxz2", "post" : [ 6, 7, 8, 9, 10 ] }
{ "_id" : ObjectId("5deaa516b636150f1bc3e7db"), "name" : "wxz3", "post" : [ 4, 5, 6, 9, 10 ] }
{ "_id" : ObjectId("5deaa51eb636150f1bc3e7dc"), "name" : "wxz4", "post" : [ 9, 10 ] }
{ "_id" : ObjectId("5deaa528b636150f1bc3e7dd"), "name" : "wxz5", "post" : [ 9, 10, 11 ] }
{ "_id" : ObjectId("5deaa77eb636150f1bc3e7de"), "name" : "WXz2", "post" : [ 1, 2, 3 ] }

distinct 的使用 获取某一个字段的不重复值
查看name 的不重复值
db.c2.distinct('name')
[ "wxz1", "wxz2", "wxz3", "wxz4", "wxz5", "WXz2" ]

skip 的用法  
查询第三条之后的数据,包含第三条
db.c2.find().skip(2)
{ "_id" : ObjectId("5deaa516b636150f1bc3e7db"), "name" : "wxz3", "post" : [ 4, 5, 6, 9, 10 ] }
{ "_id" : ObjectId("5deaa51eb636150f1bc3e7dc"), "name" : "wxz4", "post" : [ 9, 10 ] }
{ "_id" : ObjectId("5deaa528b636150f1bc3e7dd"), "name" : "wxz5", "post" : [ 9, 10, 11 ] }
{ "_id" : ObjectId("5deaa77eb636150f1bc3e7de"), "name" : "WXz2", "post" : [ 1, 2, 3 ] }


limit 的用法
查询第三条之后的数据,包含第三条,且只要两条
db.c2.find().skip(2).limit(2)
{ "_id" : ObjectId("5deaa516b636150f1bc3e7db"), "name" : "wxz3", "post" : [ 4, 5, 6, 9, 10 ] }
{ "_id" : ObjectId("5deaa51eb636150f1bc3e7dc"), "name" : "wxz4", "post" : [ 9, 10 ] }


db.createCollection('c3')
db.c3.insert({name:'user1',post:[{title:1},{title:2},{title:3}]});
db.c3.insert({name:'user2',post:[{title:'one'},{title:'two'},{title:'three'}]});


查找 title 为2的那条记录
db.c3.find({'post.title':2})
{ "_id" : ObjectId("5deb31f3dcc5b25963348d26"), "name" : "user1", "post" : [ { "title" : 1 }, { "title" : 2 }, { "title" : 3 } ] }

#避免上面语句.可能会在其他语言有影响,可以使用以下方式
db.c3.find({post:{$elemMatch:{title:2}}});
{ "_id" : ObjectId("5deb31f3dcc5b25963348d26"), "name" : "user1", "post" : [ { "title" : 1 }, { "title" : 2 }, { "title" : 3 } ] }



 
 

 

### 关于 Java 和 MongoDB 的分页查询实现 在 Java 中使用 MongoDB 进行分页查询是一种常见的需求,通常通过 `skip` 和 `limit` 方法来控制返回的结果集大小以及跳过的文档数量。以下是详细的说明和示例代码。 #### 分页查询的核心概念 分页查询的关键在于两个操作: 1. **Skip**: 跳过指定数量的记录。 2. **Limit**: 限制返回的记录数。 这些方法可以通过 Spring Data MongoDB 或原生 MongoDB 驱动程序轻松实现[^1]。 --- #### 使用 Spring Data MongoDB 实现分页查询 Spring Data 提供了一个强大的工具类 `PageRequest` 来简化分页逻辑。以下是一个完整的例子: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import java.util.List; public class MongoPaginationExample { @Autowired private MongoTemplate mongoTemplate; public List<Document> getPaginatedDocuments(int page, int size) { Pageable pageable = PageRequest.of(page, size); // 创建分页对象 Query query = new Query().with(pageable); // 将分页应用到查询中 return mongoTemplate.find(query, Document.class); } } ``` 上述代码展示了如何利用 `PageRequest.of(page, size)` 构造分页参数,并将其应用于查询中。 --- #### 使用原生 MongoDB 驱动实现分页查询 如果不依赖 Spring Data,也可以直接使用 MongoDB 原生驱动完成同样的功能。以下是一个基于官方驱动的例子: ```java import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoClients; import org.bson.Document; import static com.mongodb.client.model.Filters.*; public class NativeMongoPagination { public static void main(String[] args) { try (var client = MongoClients.create()) { // 初始化客户端连接 var database = client.getDatabase("test"); var collection = database.getCollection("documents"); int skipCount = 10; // 跳过的文档数 int limitSize = 5; // 返回的最大文档数 FindIterable<Document> documents = collection.find() .skip(skipCount) .limit(limitSize); for (Document doc : documents) { System.out.println(doc.toJson()); } } } } ``` 此代码片段演示了如何手动设置 `skip` 和 `limit` 参数以实现分页效果。 --- #### 日志调试配置 为了更好地理解底层 SQL 查询行为,在应用程序的配置文件中启用日志可以帮助开发者跟踪请求细节。例如,在 `application.properties` 文件中添加如下内容即可开启相关日志输出: ```properties logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG ``` 这一配置能够帮助开发人员捕获并分析实际发送至数据库的操作命令。 --- ### 总结 无论是采用 Spring Data 抽象层还是直接调用 MongoDB 官方 API,都可以高效地构建支持分页的功能模块。推荐优先考虑框架封装好的解决方案(如 `PageRequest`),因为它们不仅减少了重复编码的工作量,还提供了额外的安全性和灵活性保障。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值