假设您有以下架构
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(....)
答案 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() }) )
基本上做同样的事情,但转换是在从服务器检索每个文档而不是转换服务器本身时完成的。