普通查询

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) => {

});
});
})();

下面来解析:

  1. 使用aggregate聚合查询重复数据
  • $group中是查询条件,根据content、endTime、startTime字段来聚合相同的数据;
  • $count用来统计重复出现的次数,$match来过滤没有重复的数据;
  • $addToSet将聚合的数据id放入到dups数组中方便后面使用;
  1. 查询结果使用forEach进行迭代id来删除数据
  • shift()作用是剔除队列中第一条id,避免删掉所有的数据;

    PS:注意函数的大小写,mongoDB是严格区分大小写的!!!

未完待续…