2017-10-19 6 views
1

は(大文字の関数はDBMSの組み込み関数であるかもしれないあなたがmongoDbのドキュメントフィールドにユーザー定義関数(UDF)を適用する方法は?

employee(firstname, lastname, dept) 

たちはlastnameは、テーブル内のすべての行のために大文字にしたいとし、次のスキーマを持っていると言うことができますが、それだと仮定することができます我々はmangoDBで同等とは何ですか?

Select firstname, toUpper(lastname) as lastname, dept 
From employees 
を行っているでしょうSQLでUDF)

私たちは、次のJSONsを含むドキュメントemployeesを持っていることを知っ:

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

目標は直接仕事を得るために余分なJSコードを記述することなく、MongoDBのクエリAPIを使用して変更データを取得することです。

私はMongoDBにUDFを保存/インポートする方法を知っています。 $project

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

答えて

2

使用.aggregate()$toUpper::私は何を知っていないと、結果にそれを適用する方法であるあなたが「tranformations」のために行く場所

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

集約フレームワークは、基本的に上あらゆる種類のデータ。 .find()メソッドは実際にはドキュメントの「単純選択」のためのものであり、プロパティの単純な「包含」または「除外」をサポートしています。

SQLに精通している場合は、コアドキュメントのSQL to Aggregation Mapping Chartを使用して一般的なフレーズを適用する方法を理解しておくとよいでしょう。

「代替」アプローチとして、結果をサーバーから取得した後のデータに「変換」を適用することもできます。すべてのドライバーはこの目的のために何らかの形のcursor.map()を提供しています。 JavaScriptのシェル例として

:本質的に同じことを行うが、サーバ自体に形質転換とは対照的に、各文書がサーバから取得されるように変換が行われ

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

+0

「toUpper」は単なる例でした。私は 'my_udf'という名前のUDFを持っています。 'db.employees.aggregate([ {" $ project ":{ " firstname ":1、 "姓} ":{" $ my_udf ":" $ firstname "}、 " dept ":1、 }} ]' – MassyB

+0

@MassyB私は実際にまだ書いていました。ポイントは、サポートされている[集計演算子](https://docs.mongodb.com/manual/reference/operator/aggregation/)を使用するか、結果が返された後に適用します。しかし、集約パイプライン内でJavaScript関数を実行することはできません。それはそれが動作する方法ではない –

+0

ありがとう! 私はサーバー側で解決策を探していました... – MassyB

関連する問題