如何将用户定义的函数(UDF)应用于mongoDb中的文档字段?

时间:2017-10-19 01:03:25

标签: mongodb

假设您有以下架构

employee( firstname, lastname, dept)

假设我们希望lastname对于表中的所有行都是大写的(大写函数可能是DBMS中的内置函数,但我们假设它是UDF)

在SQL中我们会做以下

Select firstname, toUpper(lastname) as lastname, dept
From employees 

mangoDB中的等价物是什么?知道我们有一个包含以下JSON的文档employees

...
{ "firstname": "jhon", "lastname": "doe", "dept": "marketing"}
...
{ "firstname": "jean", "lastname": "dupont", "dept": "sales"}
...

目标是使用mongoDB查询API直接获取已更改的数据,而无需编写额外的JS代码来完成工作。

我知道如何在MongoDB中保存/导入UDF。我不知道的是如何将其应用于结果:

db.employees.find().apply_my_udf(....)

1 个答案:

答案 0 :(得分:3)

.aggregate()中使用$toUpper$project

db.employees.aggregate([
  { "$project": {
    "firstname": 1,
    "lastname": { "$toUpper": "$firstname" },
    "dept": 1,
  }}
])

聚合框架基本上是您对任何类型的数据进行“转换”的地方。 .find()方法实际上仅用于文档的“简单选择”,并且仅支持简单的“包含”或“排除”属性。

如果您对SQL有一定的了解,那么核心文档中的SQL to Aggregation Mapping Chart是了解如何应用常用短语的好地方。

当然,作为一种“替代”方法,您还可以在“从服务器获取结果”之后将“转换”应用于数据。为此目的,所有驱动程序都提供某种形式的cursor.map()

作为JavaScript shell示例:

db.employees.find().map( d => Object.assign(d, { lastname: d.lastname.toUpperCase() }) )

基本上做同样的事情,但转换是在从服务器检索每个文档而不是转换服务器本身时完成的。

相关问题