javascript - UnhandledPromiseRejectionWarning: MongoError: 無効な $addFields :: 原因:: 本体関数を指定する必要があります

okwaves2024-01-25  183

:) MongoDB の集計内で $function を使用するとエラーが発生しました。次で始まる集計があります。

db.collection.aggregate([
 {
   $addFields: {
      geohash: {
        $function: {
           body: function (coord1, coord2) {
             let geohash = Geohash.encode(coord1, coord2);
             return geohash
           },
          args: [
            "$location.coordinates[0]",
            "$location.coordinates[1]",
           ],
           lang: "js",
         },
       },
    },
  },
])

しかし、クエリを実行すると次のエラーが表示されます: UnhandledPromiseRejectionWarning: MongoError: Invalid $addFields :: 原因:: 本体関数を指定する必要があります。

私は Mongo のバージョン 4.4 を使用しており、このコードを Node.Js 関数内で実行しています。助けていただければ幸いです。よろしくお願いします。 :)

ところで、参考としてこのドキュメントを使用しました: https://docs.mongodb.com/manual/reference/operator/aggregation/function/

この関数 Geohash.encode をどこで定義しましたか?

– トゥリヴィシャル

2020 年 9 月 3 日 12:07

@turivishal これは Ngeohash というモジュールです。 const Geohash = require("ngeohash"); でインポートしました。

– アメル・メミック

2020 年 9 月 3 日 12:12

1

外部からはアクセスできないと思いますこの関数を使用すると、デフォルトの nmongodb 演算子式関数にアクセスできるようになります。これをチェックすると、$function でカスタム ロジックとコードを定義できます。

– トゥリヴィシャル

2020 年 9 月 3 日 12:34



------------------------

前に同じことを試してみましたが、関数の本体は文字列である必要があり、外部の関数にアクセスできないようです。したがって、問題の解決策は次のようになります。

db.collection.aggregate([
 {
   $addFields: {
      geohash: {
        $function: {
           body: `function (coord1, coord2) {
             // NOTE: you need to define Geohash inside the function
             let geohash = Geohash.encode(coord1, coord2);
             return geohash
           }`,
          args: [
            "$location.coordinates[0]",
            "$location.coordinates[1]",
           ],
           lang: "js",
         },
       },
    },
  },
])

これは私が以前に試したことです:

const updateDocEx = [{
      $set: {
        status: 'Modified',
        comments: {
          $function: {body: `function (val, newVal) {
            const vx = '';
            const v1 = !val ? newVal : vx.concat(val, ',', newVal);
            const v2 = v1.split(',');
            const v3 = [...new Set(v2)];
            return v3.join(',');
          }`, args: ['$comments', 'A5'], lang: 'js'}
        },
        lastUpdate: '$$NOW'
      },
    }];

4

1

nodejs では動作しますか? mongo シェルでは動作しますが、これを試してみましたが、mongo クライアントと mongoose を使用して更新すると、nodejs では動作しません。

– アビマニュ

2021 年 4 月 13 日 14:19

mongodb と nodejs では動作しますが、mongoose では動作しません。 nodejs にはネイティブ mongodb ドライバーを使用する必要があります

– ビンドゥニ

2021 年 4 月 13 日 19:17

これは mongoose、MongoDB バージョン 4.4.2 で確実に動作します

– ランジート・エッパカヤラ

2022 年 2 月 18 日 20:29

ご回答いただきまして誠にありがとうございます。文字列に変換したら動作しました。私はこれにほぼ2日間苦労しました。 body が文字列でなければならないということはどこにも記載されていないと思います。それを見つけてくれてありがとう。

– バラスブラマニアン S

2023 年 9 月 16 日 14:33

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。