mongodb数组字段prefix匹配返回

仲远
• 阅读 1668

DOC: https://docs.mongodb.com/manu...

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'
        ]
    }
    ...
]

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
MongoDB开发系列
本篇文章主要介绍数据集设计中的分桶范式以及使用实例。数据集设计模式,MongoDB在官方文档https://docs.mongodb.com/ecosystem/ 中的usecases部分提供了详细的参考内容。结合文档,本篇说一些比较深入的MongoDB使用分桶模式分桶模式是MongoDB数据集设计的一种范式。分桶buckets
Stella981 Stella981
3年前
CentOS7安装MongoDB企业版
参考MongoDB官方网站:https://docs.mongodb.com/manual/tutorial/installmongodbenterpriseonredhat/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdocs.mongodb.com%2Fman
Wesley13 Wesley13
3年前
MongoDB
一、MongoDB是一款NoSql数据库二、部署单实例MongoDB1.安装环境:(1)系统:Centos7.2(2)MongoDB:Percona的MongoDB3.42.配置yum源percona官方文档【https://www.percona.com/doc/perconarepoconfig/yumrepo.html】
Wesley13 Wesley13
3年前
mongodb经验
MongoDB聚合管道(AggregationPipeline)http://www.cnblogs.com/shanyou/p/3494854.html比如文档下的数组,只需要返回匹配。可以采用先打散再匹配的方式。例如.collection('activity').aggregate({$unwind:"$applyment"},{$m
Stella981 Stella981
3年前
MongoDB Sharding分片配置
Ps:mongod是mongodb实例,mongos被默认为为mongodbsharding的路由实例。本文使用的mongodb版本为3.2.9,因此参考网址为:https://docs.mongodb.com/v3.2/sharding/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2
Stella981 Stella981
3年前
90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)
麻烦大家帮我投一票(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Frank.juejin.cn%2F%3Fu%3D%25E5%25B9%25B2%25E8%25B4%25A7%25E6%25BB%25A1%25E6%25BB%25A1%25E5%25BC%25A0%25E5%259
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MongoDB:创建数据集合
点击查看原文。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.oxysun.cn%2Fmongodb%2Fmongodbcollectioncreate.html)官网地址:https://docs.mongodb.com/manual/reference/met
Stella981 Stella981
3年前
Linux系统在信息社会的发展
随着信息技术(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D%25E4%25BF%25A1%25E6%2581%25AF%25E6%258A%2580%25E6%259C%25AF%26tn%3DSE_PcZhidaonwhc_ngpa
仲远
仲远
Lv1
送子军中饮,家书醉里题。
文章
5
粉丝
0
获赞
0