mongodb条件查询语句_数据与数据元素的关系

mongodb条件查询语句_数据与数据元素的关系这里记录一个查询需求:数据库中字段的值(数组类型)都在指定的数组中。举例说一下实际场景,数据库中一个字段存储用户“可以使用的编程语言”,一般都会是多个,所以该字段是数组格式。现在要查询的是:会c#、j

记一次Mongodb数据库查询之包含所有指定元素的数组或者都在指定元素的数组中 - du

  这里记录一个查询需求:数据库中字段的值(数组类型)都在指定的数组中。举例说一下实际场景,数据库中一个字段存储用户“可以使用的编程语言”,一般都会是多个,所以该字段是数组格式。现在要查询的是:会c#、javascript或者只会c#或者只会javascript的用户,翻译一下就是数据库中字段的值是子集而给定的数组是全集。这种查询需要在mongodb没有找到特定的查询操作符,这篇笔记主要解决这个问题,顺便介绍一下”$all”运算符。”$all”查询的是数据库字段的值包含所有指定元素的数组,也就是数据库中字段的值是全集而给定的数组是子集,和前面提到的需求相反。

  为了演示上述的两种查询需求,先造一些测试数据,下面是表结构:

编程语言调查表(FormId: 507048044944694000, FormVersion: 507048044944694001

唯一标识

中文描述

控件类型

是否必填

表单项的其他配置(在表单设计时配置,文本框长度、时间格式等)

1572493554001

用户

选择人员控件

1572493554002

可以使用的编程语言

复选框

1572493554003

最喜欢的编程语言

文本框

1572493554004

工作地点

文本框

1572493554005

工作年限

数值输入框

1572493554006

备注

多行文本框

  下面是造数据的语句

mongodb条件查询语句_数据与数据元素的关系

var GV_TableName = "FormInstace",
    GV_FormId = "507048044944694000",
    GV_FormVersion = "507048044944694001",
    GV_CreateUserIds = ["user10000", "user10001", "user10002", "user10003", "user10004", "user10005", "user10006", "user10007", "user10008", "user10009"];

var GV_LangObj = {
    1: {
        id: "1",
        text: "C#"
    },
    2: {
        id: "2",
        text: "JavaScript"
    },
    3: {
        id: "3",
        text: "HTML"
    },
    4: {
        id: "4",
        text: "CSS"
    },
    5: {
        id: "5",
        text: "Go"
    },
    6: {
        id: "6",
        text: "Rust"
    }
};
var GV_Name2Id = {
    "userName": "1572493554001",
    "lang": "1572493554002",
    "favLang": "1572493554003",
    "workPlace": "1572493554004",
    "workYears": "1572493554005",
    "remarks": "1572493554006",
};

var getGUID = function () {
    return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0,
        v = c == "x" ? r : (r & 0x3 | 0x8);
        return v.toString(16).toUpperCase();
    });
}

var getFormInstanceOtherAttrs = function (formId, formVersion) {
    var tempCreateUserIdIndex = Math.floor(Math.random() * GV_CreateUserIds.length),
    tempCreateDate = ISODate();
    return {
        _id: getGUID(),
        ExtendData: {},
        CreateUserId: GV_CreateUserIds[tempCreateUserIdIndex],
        CreateUserName: GV_CreateUserIds[tempCreateUserIdIndex],
        CreateDate: tempCreateDate,
        LastModifyDate: tempCreateDate,
        FormId: GV_FormId,
        FormVersion: GV_FormVersion
    };
};

var assembleFormInstance = function (formItemsAttr) {
    return Object.assign(formItemsAttr, getFormInstanceOtherAttrs());
}

//************************************************************************************************************************************************

//    批量插入数据
db[GV_TableName].insertMany([
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u1"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["1"], GV_LangObj["2"], GV_LangObj["3"], GV_LangObj["4"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["1"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "北京"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 1
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u2"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["1"], GV_LangObj["2"], GV_LangObj["6"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["6"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "天津"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 2
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u3"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["1"], GV_LangObj["2"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["1"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "石家庄"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 3
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u4"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["1"], GV_LangObj["5"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["5"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "上海"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 4
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u5"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["1"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["1"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "广州"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 5
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u6"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["2"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["2"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "深圳"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 6
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u7"
                }, {
                    key: GV_Name2Id.lang,
                    value: []
                }, {
                    key: GV_Name2Id.favLang,
                    value: []
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "成都"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 7
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
        assembleFormInstance({
            FormItems: [{
                    key: GV_Name2Id.userName,
                    value: "u8"
                }, {
                    key: GV_Name2Id.lang,
                    value: [GV_LangObj["5"], GV_LangObj["6"]]
                }, {
                    key: GV_Name2Id.favLang,
                    value: [GV_LangObj["5"]]
                }, {
                    key: GV_Name2Id.workPlace,
                    value: "重庆"
                }, {
                    key: GV_Name2Id.workYears,
                    value: 8
                }, {
                    key: GV_Name2Id.remarks,
                    value: "随便写点什么"
                }
            ]
        }),
    ]);

View Code

  看一下插入的数据:

mongodb条件查询语句_数据与数据元素的关系

   这里数据结构和之前表单生成器(Form Builder)之表单数据存储结构mongodb篇文章中介绍的一样。为了方便查看,将“可以使用的编程语言”字段从“FormItems”数组中拿出来并放在最外层,下面是语句

//    通用聚合管道(将“编程语言”表单项从"FormItems"中拷贝一份放到最外层,方便查看)
var showLangItemPrePipeline = [{
        $addFields: {
            FormItemObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [
                            "$$field.key",
                            "$$field.value"
                        ]
                    }
                }
            }
        }
    }, {
        $addFields: {
            "LangFormItem": "$FormItemObj.1572493554002",
        }
    }, {
        $addFields: {
            "1572493554002": {
                $reduce: {
                    input: "$LangFormItem",
                    initialValue: "",
                    in: {
                        $concat: ["$$value", "$$this.text", ","]
                    }
                }
            },
        }
    }, {
        $project: {
            "FormItemObj": 0,
            "LangFormItem": 0
        }
    }
];
//    1、查询:展示一下插入的示例数据
db.getCollection("FormInstace").aggregate(showLangItemPrePipeline);

  下面看一下查询效果:

mongodb条件查询语句_数据与数据元素的关系

   说明:从制造假数据的语句中你可以看到“1572493554002”字段是数组类型并且每一项都是一个对象,上图中将数组拼接成了字符串,方便查看。

  先来看一下数据库中字段的值都在指定元素的数组中的查询语句:

//    通用聚合管道(将“编程语言”表单项从"FormItems"中拷贝一份放到最外层,方便查看)
var showLangItemPrePipeline = [{
        $addFields: {
            FormItemObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [
                            "$$field.key",
                            "$$field.value"
                        ]
                    }
                }
            }
        }
    }, {
        $addFields: {
            "LangFormItem": "$FormItemObj.1572493554002",
        }
    }, {
        $addFields: {
            "1572493554002": {
                $reduce: {
                    input: "$LangFormItem",
                    initialValue: "",
                    in: {
                        $concat: ["$$value", "$$this.text", ","]
                    }
                }
            },
        }
    }, {
        $project: {
            "FormItemObj": 0,
            "LangFormItem": 0
        }
    }
];
db.getCollection("FormInstace").aggregate(showLangItemPrePipeline.concat([{
                "$match": {
                    "FormId": "507048044944694000",
                    "FormItems": {
                        "$elemMatch": {
                            "key": "1572493554002",
                            "value.0": {
                                "$exists": true
                            },
                            "value": {
                                "$not": {
                                    "$elemMatch": {
                                        "text": {
                                            "$nin": ["C#", "JavaScript"]
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        ]))

  来一张截图,看一下查询结果:

mongodb条件查询语句_数据与数据元素的关系

   注意:这里语句中还用到了“$exists”运算符,如果不添加这个会将数组长度为0的查出来。参考链接。

  在看一下“$all”查询,数据库字段的值包含所有指定元素的数组:

//    通用聚合管道(将“编程语言”表单项从"FormItems"中拷贝一份放到最外层,方便查看)
var showLangItemPrePipeline = [{
        $addFields: {
            FormItemObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [
                            "$$field.key",
                            "$$field.value"
                        ]
                    }
                }
            }
        }
    }, {
        $addFields: {
            "LangFormItem": "$FormItemObj.1572493554002",
        }
    }, {
        $addFields: {
            "1572493554002": {
                $reduce: {
                    input: "$LangFormItem",
                    initialValue: "",
                    in: {
                        $concat: ["$$value", "$$this.text", ","]
                    }
                }
            },
        }
    }, {
        $project: {
            "FormItemObj": 0,
            "LangFormItem": 0
        }
    }
];
db.getCollection("FormInstace").aggregate(showLangItemPrePipeline.concat([{
                "$match": {
                    "FormId": "507048044944694000",
                    "FormItems": {
                        "$elemMatch": {
                            "key": "1572493554002",
                            "value.text": {
                                "$all": ["C#", "JavaScript"]
                            }
                        }
                    }
                }
            }
        ]))

  来一张截图,看一下查询结果:

mongodb条件查询语句_数据与数据元素的关系

   这里在顺便记录一下在mongodb中数值转字符串,高版本有“$toString”操作符(版本4.0)、“$convert”操作符(版本4.0)……但是低版本的该如何处理,参考链接。这个例子比较简单,就不写制造数据的语句了,直接来查询语句:

db.getCollection("test001").aggregate([
    {
        $addFields: {
            "ageStr": { $substr: [ "$num", 0, -1 ] }
        }
    }
])

  来一张截图,看一下查询结果:

mongodb条件查询语句_数据与数据元素的关系

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5602.html

(0)
上一篇 2023-05-02
下一篇 2023-05-02

相关推荐

  • 新特性解读 | 趋近完美的 Undo 空间[通俗易懂]

    新特性解读 | 趋近完美的 Undo 空间[通俗易懂]作者:杨涛涛 资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生…

    2023-02-19
    98
  • Python Tkinter GUI布局方案

    Python Tkinter GUI布局方案Python Tkinter是一种Python的标准GUI库,它提供了丰富的图形用户界面组件和功能,让开发者能够方便地创建漂亮、可靠的用户界面。布局(Layout)是Tkinter GUI开发中一个非常重要的环节,它决定了每个组件在屏幕上的位置、大小以及与其他组件之间的关系。在本文中,我们将探讨Python Tkinter中常用的布局方案及其优缺点,并提供相应的代码示例。

    2024-01-22
    65
  • 第17问:如何评估 alter table 的进度?

    第17问:如何评估 alter table 的进度?问题 我们执行 alter table 语句后,经常面临“跑又跑不完,杀又不敢杀”的窘境。 如果能评估 alter table 的进度就幸福多了。 实验 MySQL官方已经给出了文档:https:/…

    2023-03-26
    96
  • Python UTC时间戳转换:秒数计算

    Python UTC时间戳转换:秒数计算UTC全称是Coordinated Universal Time,中文通用协调时间。它是世界上标准的时间,也是国际上授时和频率传递的基准。UTC时间戳是指从UTC纪元(1970年1月1日0:00:00)起至今所经过的秒数。它是一种记录时间的方式,通常用于计算时间间隔或时间差。

    2024-01-30
    69
  • sqlite修改表、表字段等与sql server的不同之处

    sqlite修改表、表字段等与sql server的不同之处sqlite中只支持 ALTER TABLE 命令的 RENAME TABLE 和 ADD COLUMN。 其他类型的 ALTER TABLE 操作如 DROP COLUMN,ALTER COLUMN

    2022-12-19
    104
  • 通过Python收集MySQL MHA 部署及运行状态信息的功能实现[亲测有效]

    通过Python收集MySQL MHA 部署及运行状态信息的功能实现[亲测有效]一. 背景介绍 当集团的MySQL数据库实例数达到2000+、MHA集群规模数百个时,对MHA的及时、高效管理是DBA必须面对的一个挑战。MHA 集群 节点信息 和 运行状态 是管理的基础。本篇幅主要

    2023-04-23
    106
  • Mysql数据库(一)-「建议收藏」

    Mysql数据库(一)-「建议收藏」一、 数据库的分类 1、SQL Server 数据库 2、Oracle 数据库 3、mysql 数据库 4、DB2 5、informix 以上是比较流行的数据库,这里没有一一介绍,而是展示出来以便了解

    2023-02-13
    116
  • 提高学员学习交互性的Python课程平台

    提高学员学习交互性的Python课程平台Python课程平台的界面设计是提高学员学习交互性的重要因素之一。在界面设计过程中,需要考虑学员的视觉和操作体验,如何使学员可以快速、方便地找到所需功能和内容。

    2024-02-24
    61

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注