普通查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| > db.customer.findOne() { "_id" : ObjectId("57636c8e35defe029962107e"), "_class" : "com.bu2trip.ticket.model.Customer", "name" : "wang", "phone" : "18408221624", "gender" : 1, "birthday" : "1995-7-9", "passport" : "620524", "login_user" : { "_id" : ObjectId("5760e593086659036b77c124"), "email" : "test@bu2trip.com", "phone" : "110" } }
|
查询整个内嵌文档
1
| db.customer.find({"login_user" : {"_id":ObjectId("5760e593086659036b77c124"), "email" : "test@bu2trip.com","phone" : "110"}})
|
只针对内嵌文档的特定键值进行查询如下:
1
| db.customer.findOne({"login_user.phone":"110"})
|
ps: 嵌套查询并非直接传入嵌套对象,而是出入具体属性的应用路径。
mongodb中没有像mysql中直接去重的指令。如下是找到的去重方法的小小改良版。
去重用处就很明显了可用于数据清洗。直接上实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| (async () => { let data = await db.Wnl.aggregate([ { $group: { _id: '$data.title', count: { $sum: 1 }, dups: { $addToSet: '$_id' } } }, { $match: { count: { $gt: 1 } } } ]);
data.forEach((it) => { it.dups.shift(); db.Wnl.remove({ _id: { $in: it.dups } }); db.Wnl.deleteMany({ _id: { $in: it.dups } }, (err, res) => {
}); }); })();
|
下面来解析:
- 使用aggregate聚合查询重复数据
- $group中是查询条件,根据content、endTime、startTime字段来聚合相同的数据;
- $count用来统计重复出现的次数,$match来过滤没有重复的数据;
- $addToSet将聚合的数据id放入到dups数组中方便后面使用;
- 查询结果使用forEach进行迭代id来删除数据
- shift()作用是剔除队列中第一条id,避免删掉所有的数据;
PS:注意函数的大小写,mongoDB是严格区分大小写的!!!
未完待续…
最終更新:
这里可以写作者留言,标签和 hexo 中所有变量及辅助函数等均可调用,示例:
https://ryansuen.github.io/2018/08/30/mongodb-query要点/