概述
最近用fastify做一个项目的后台,数据库用的mongodb,有一个需求,需要根据mongo中一条记录中的子属性查询和排序,懂的人貌似很简单,不过初学还是踩了很多坑,而且网上针对这个问题的文章也不很多,在此将mongodb在使用过程中的一些坑和经验分享与大家.
MongoDB根据内置文档属性查询
先上数据
/* 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没有盘点的记录,直接上代码
也就是根据内置文档属性查询记录的方式
db.getCollection('cars').find({"readCardRecords.day2018-8-13":{$exists:false}});
查询很顺利,结果如下:
/* 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",是一个静态的值,如何改成动态的呢?
有道友肯定想到
var today = new Date(),
todayCondition = 'readCardRecords.day' + today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
db.getCollection('cars').find({todayCondition: {$exists:false}})
结果肯定是不行,这样查询的是todayCondition 属性不存在的记录
于是慰问了一下产品经理后,就有了一下的灵感
var today = new Date(),
todayCondition = 'day' + today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
var todayQueryConditions = {todayCondition:{$exists:false} };
db.getCollection('cars').find(todayQueryConditions);
事实证明,还是拿不到数据,
不赘述,上代码
var 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根据内置文档属性查询 -- > 关于mongoDB查询内置文档属性的坑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复