最近用fastify做一个项目的后台,数据库用的mongodb,有一个需求,需要根据mongo中一条记录中的子属性查询和排序,懂的人貌似很简单,不过初学还是踩了很多坑,而且网上针对这个问题的文章也不很多,在此将mongodb在使用过程中的一些坑和经验分享与大家.
MongoDB根据内置文档属性查询
先上数据
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
27
28/* 1 */ { "_id" : ObjectId("5b713aa9e7f2d30ca8065b84"), "cardId" : "e36add71-ea6f-4ef8-af96-0838741e90ab", "storeId" : ObjectId("5b690aa8d9df6f1040ab3549"), "adddate" : "2018-08-13", "readCardRecords" : { "day2018-8-13" : true } } /* 2 */ { "_id" : ObjectId("5b713c8ce7f2d30ca8065b86"), "cardId" : "34e3149a-d536-4387-a7ee-7d84c3fa1633", "storeId" : ObjectId("5b69192c0cb05a1681e72c79"), "adddate" : "2018-08-13", "readCardRecords" : {} } /* 3 */ { "_id" : ObjectId("5b7151af5373aa0cb45d3e97"), "cardId" : "c28a234f-340c-4d5a-86b0-9885a2bd0c30", "storeId" : ObjectId("5b69192c0cb05a1681e72c79"), "adddate" : "2018-08-13", "readCardRecords" : { "day2018-8-13" : true } }
查出 readCardRecords中当天的记录不存在的数据
readCardRecords中存放的是每辆车的盘点记录,每次盘点成功,就会在readCardRecords中插入一条格式如{"day2018-8-13" : true}的属性.需求是找出所有车辆中今天没有盘点的车辆.
技术拆分,有两步骤:
1.根据日期,动态生成查询条件;
2.根据子属性查出相应的记录
先说简单的,直接查询2018-08-13没有盘点的记录,直接上代码
也就是根据内置文档属性查询记录的方式
1db.getCollection('cars').find({"readCardRecords.day2018-8-13":{$exists:false}});
查询很顺利,结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/* 1 */ { "_id" : ObjectId("5b713a33e7f2d30ca8065b82"), "cardId" : "c75364a7-e06e-4243-937d-7bf090781601", "storeId" : ObjectId("5b690aa8d9df6f1040ab3549"), "adddate" : "2018-08-13", "readCardRecords" : {} } /* 2 */ { "_id" : ObjectId("5b713a67e7f2d30ca8065b83"), "cardId" : "6d5fa9b2-6de2-4351-af50-0efeff9305a2", "storeId" : ObjectId("5b690aa8d9df6f1040ab3549"), "adddate" : "2018-08-13", "readCardRecords" : {} }
当时需求是根据当天日期查询当天未盘点的数据. 是动态查询
为什么每次遇到关卡的时候,第一时间想到的就是找产品经理敲打敲打找找灵感呢??
正题,正题! 我们上面的查询语句{"readCardRecords.day2018-8-13":{$exists:false}}中的键为"readCardRecords.day2018-8-13",是一个静态的值,如何改成动态的呢?
有道友肯定想到
1
2
3var today = new Date(), todayCondition = 'readCardRecords.day' + today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); db.getCollection('cars').find({todayCondition: {$exists:false}})
结果肯定是不行,这样查询的是todayCondition 属性不存在的记录
于是慰问了一下产品经理后,就有了一下的灵感
1
2
3
4var today = new Date(), todayCondition = 'day' + today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); var todayQueryConditions = {todayCondition:{$exists:false} }; db.getCollection('cars').find(todayQueryConditions);
事实证明,还是拿不到数据,
不赘述,上代码
1
2
3var today = new Date(), todayCondition = 'readCardRecords.day' + today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); db.getCollection('cars').find({[todayCondition]: {$exists:false}})
发现区别了吗 ?
.find({ [todayCondition] : {$exists:false}})
把你的变量用[ ]包起来,就可以实现查询条件的动态传值了!是不是很简单
个人主页:http://blog.nongshiye.com?f=csdn
最后
以上就是勤劳泥猴桃最近收集整理的关于MongoDB根据内置文档属性查询 -- > 关于mongoDB查询内置文档属性的坑的全部内容,更多相关MongoDB根据内置文档属性查询内容请搜索靠谱客的其他文章。
发表评论 取消回复