我是靠谱客的博主 勤劳泥猴桃,最近开发中收集的这篇文章主要介绍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

最后

以上就是勤劳泥猴桃为你收集整理的MongoDB根据内置文档属性查询 -- > 关于mongoDB查询内置文档属性的坑的全部内容,希望文章能够帮你解决MongoDB根据内置文档属性查询 -- > 关于mongoDB查询内置文档属性的坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部