MongoDB根据内置文档属性查询 -- > 关于mongoDB查询内置文档属性的坑

最近用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值