博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb数组字段prefix匹配返回
阅读量:6689 次
发布时间:2019-06-25

本文共 2763 字,大约阅读时间需要 9 分钟。

DOC:

collection(test)结构

{    _id: Objectd("123456789"),    category: [        'apple_1',        'apple_2',        'banana_1',        'banana_2'    ]}

Question:

对test表的所有数据做category过滤,返回category中以apple开头的元素

表原数据:

[        {        _id: Objectd("id1"),        category: [            'apple_1',            'apple_2',            'banana_1',            'banana_2'        ]    },    {        _id: Objectd("id2"),        category: [            'apple_3',            'apple_4',            'banana_1',            'banana_2'        ]    }    ...]

返回数据示例:

[        {        _id: Objectd("id1"),        category: [            'apple_1',            'apple_2'        ]    },    {        _id: Objectd("id2"),        category: [            'apple_3',            'apple_4'        ]    }    ...]

数据库try:随机构建test表

function getRandomArrayElements(arr, count) {    var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;    while (i-- > min) {        index = Math.floor((i + 1) * Math.random());        temp = shuffled[index];        shuffled[index] = shuffled[i];        shuffled[i] = temp;    }    return shuffled.slice(min);}var temp = ['apple_1','apple_2','banana_3','banana_4','pear_5','pear_6','pear_7'];for(var i =0; i < 10; i ++){    db.getCollection("test").insert({            category:getRandomArrayElements(temp, Math.random()*7)    })}

Try 1:

db.test.find({},{'category':{    '$elemMatch':{        $regex: 'apple'    }}})

返回:

[        {        _id: Objectd("id1"),        category: [            'apple_1',        ]    },    {        _id: Objectd("id2"),        category: [            'apple_3',        ]    }    ...]
category只保留了符合过滤规则的第一个元素

Try 2:

db.test.aggregate(    {        $unwind: '$category'    },    {        $match: {            category: {             $regex: 'apple_'            }        }    },    //unwind,match顺序不能换)

返回:

[        {        _id: Objectd("id1"),        category: 'apple_1'    },    {        _id: Objectd("id1"),        category: 'apple_2'    },    {        _id: Objectd("id2"),        category: 'apple_3'    },    {        _id: Objectd("id2"),        category: 'apple_4'    }    ...]
将一个文档拆分成多个文档返回

Try 3(Solution):

db.test.aggregate({    $project: {        "category":{            $filter: {                input: "$category",                as: "cate",                cond: {                    // category数组元素cate包含字符串'apple_'                    $eq: [ {                        $indexOfCP: ["$$cate", "apple_"]                    }, 0]                 }            }        }    }})

返回:

[        {        _id: Objectd("id1"),        category: [            'apple_1',            'apple_2'        ]    },    {        _id: Objectd("id2"),        category: [            'apple_3',            'apple_4'        ]    }    ...]

转载地址:http://wfeao.baihongyu.com/

你可能感兴趣的文章
CentOS 搭建 Mysql MMM 高可用架构
查看>>
Android设计模式(七)--原型模式
查看>>
Zabbix监控JVM内存
查看>>
OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
查看>>
java验证身份证号码是否有效源代码
查看>>
MyBatis3-配置使用log4j输出日志
查看>>
让小球跳起来
查看>>
常用存储器介绍
查看>>
P1807 最长路_NOI导刊2010提高(07)
查看>>
有下面33种症状,你就应该离开电脑到户外走走
查看>>
任正非对研究部门的方向指导
查看>>
树莓派——科大讯飞离线语音识别
查看>>
项目的坎坷一生(上)
查看>>
LeetCode139:Word Break
查看>>
thinkphp开发微信公众号时,验证基本配置提示请求url超时
查看>>
阿里云API网关(11)API的三种安全认证方式
查看>>
唯一序列号生成,自測支持高并发,不支持集群
查看>>
python str byte 转换
查看>>
二维树状数组的区间加减及查询 tyvj 1716 上帝造题的七分钟
查看>>
Swift - 类扩展(extension)
查看>>