Mongoose: モデルの保存はmongoエラーで失敗します:MongoError:不明な修飾子:$ pushAll

作成日 2017年08月23日  ·  27コメント  ·  ソース: Automattic/mongoose

機能をリクエストしバグを報告しますか?

バグを報告

現在の動作は何ですか?

ローカルマシンでテストに合格しましたが、まったく同じバージョンのjenkinsサーバーで失敗しました。 唯一の違いは、ローカルはmacosであり、jenkinsは私が知る限りubuntuです。

MacOS Sierra、ノード8.4および7.11、mongodb 3.4.7、およびmongoose 4.11.7では、次のテストに合格しますが、ubuntu16.04サーバーでまったく同じバージョンのjenkinsサーバーでは失敗します。

  it("should successfully allow an alias that matches a service", async () => {
    const aliasTag = "this is a test";
    const appAlias = await AliasController.create(user, appAliasSpec);
    const serviceAlias = await AliasController.create(user, serviceAliasSpec);

    appAlias.aliases.push(aliasTag);
    await appAlias.save(); // This is the line that fails in jenkins

    serviceAlias.aliases.push(aliasTag);
    await serviceAlias.save();

    const confAppAlias = await AliasController.getById(appAlias._id);
    const confServiceAlias = await AliasController.getById(serviceAlias._id);
    expect(confAppAlias.aliases[1]).to.equal(aliasTag);
    expect(confServiceAlias.aliases[1]).to.equal(aliasTag);
  });

これが私が得ている正確なエラーです:

{
    "message": "Unknown modifier: $pushAll",
    "name": "MongoError",
    "stack": "MongoError: Unknown modifier: $pushAll\n    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)\n    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18\n    at _combinedTickCallback (internal/process/next_tick.js:131:7)\n    at process._tickCallback (internal/process/next_tick.js:180:9)",
    "code": 9
}

編集:これはスタックトレースのより読みやすいバージョンです

MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
needs clarification

最も参考になるコメント

これが1つの問題です。mongodb3.5は不安定な開発リリースであるため、使用しないでください。 $ pushAllは長い間非推奨になっているため、3.5で削除された可能性があります。 @mbroadst明確にできますか?

しばらく前にこれを回避するためにusePushEachオプションを追加しました: https

new Schema({ arr: [String] }, { usePushEach: true });

全てのコメント27件

mongoose.set('debug', true)を実行して、mongo出力を貼り付けることはできますか?

編集:より明確な出力

Mongoose: aliases.update({ _id: ObjectId("599d98122b72d12e0ba858b4") }, { '$pushAll': { aliases: [ 'this is a test' ] }, '$set': { updatedAt: new Date("Wed, 23 Aug 2017 14:58:26 GMT") }, '$inc': { __v: 1 } })
{"name":"davis","hostname":"ld-ub-bm980a98v","pid":11787,"level":50,"err":{"message":"Unknown modifier: $pushAll","name":"MongoError","stack":"MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)","code":9},"msg":"An unhandled Mongo error occurred.","time":"2017-08-23T14:58:26.201Z","v":0}

価値があるかどうかについては、ローカルの開発環境と本番環境でデバッグ出力を確認しましたが、どちらも$ pushAll修飾子を正常に使用しています。 Mongoは、すべての場合に公式パッケージからインストールされます。 開発マシンはWindowsとMacOSであり、本番マシンはamazonlinuxです。

mongoシェルを使用してjenkinsmongodbインスタンスに接続し、 db.versionを使用してバージョンを再確認できますか?

$ mongo test
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/test
MongoDB server version: 3.4.1 
> db.version()
3.4.1
> ^C
bye

mongooseを使用してserverStatus()コマンドを使用して、サーバーのバージョンを出力することもできます。

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test');

mongoose.connection.on('open', function() {
  mongoose.connection.db.admin().serverStatus(function(error, info) {
    console.log(info.version);
  });
});

最初にバージョンを再確認してください。公式パッケージはすぐに古くなる傾向があります。

うん、同じエラーがあります。 3.2から3.5に移行しようとしました(データ移行なし)。 配列フィールドがあります

    'liked': {
        'item':[ {
            'id': {'type': Types.ObjectId, 'ref': 'Item'},
            'score': {'type': Number, 'max': 100, 'default': -1},
            'comment': {'type': String, 'maxlength': 65000, 'trim': true, 'default': '', 'set': san.methods.safe}
        } ]
    },

idは最適なフィールド名ではありませんが、3.2で機能しました。 3.5では、アイテムが配列にプッシュされた後にドキュメントを.save()しようとすると、失敗します。 .push()を介してアイテムをプッシュし、フィールド.markModified('liked.item');マークします。 簡単なはずです。

MongoDB 3.5?

はい

 targetMinOS: Windows 7/Windows Server 2008 R2
 db version v3.5.13
 git version: 52bbaa007cd84631d6da811d9a05b59f2dfad4f3
 OpenSSL version: OpenSSL 1.0.1u-fips  22 Sep 2016
 allocator: tcmalloc
 modules: none
 build environment:
     distmod: 2008plus-ssl
     distarch: x86_64
     target_arch: x86_64

これが1つの問題です。mongodb3.5は不安定な開発リリースであるため、使用しないでください。 $ pushAllは長い間非推奨になっているため、3.5で削除された可能性があります。 @mbroadst明確にできますか?

しばらく前にこれを回避するためにusePushEachオプションを追加しました: https

new Schema({ arr: [String] }, { usePushEach: true });

@ vkarpov15はい、 featureCompatibilityVersion=3.6削除されました

Touche。 その場合は、必ず#5670を入手してください。

私はubuntuでmongodbv3.6を使用しているのとまったく同じ問題を抱えています。 pushAllがdbから削除された場合、インスタンスを保存する方法よりも..代替手段を提供してください

@rankitbishnoiオプションの各スキーマ定義にusePushEachオプションを追加することで、これを一時的に回避できます。

@ vkarpov15素晴らしいライブラリサーに感謝します。

私も、Mongoose4.13.7とMongoDB3.6.0でこの問題が発生しています。

更新:モデルのスキーマオプションにusePushEach: trueを追加すると、これが解決されました。

@ dyladan @ chaddjohnsonは本当に機能します。
どうもありがとう!

どうすればこれを行うことができますか? これをスキーマオプションに追加するにはどうすればよいですか? ありがとう!

@ raphaelbp12スキーマオプションの使用に関するドキュメントは次のとおりです: http//mongoosejs.com/docs/guide.html

スキーマを更新しても、この動作は変わりません。 3.6では、データベース内の古いデータでは機能しません。

編集:バージョン3.4に戻すと、問題が解決しました。

自分のマシンでコードを実行するときに同様の問題が発生していました。 Mongoose5とMongoDB3.6のおかげだと思います。 元に戻してみてください:

  • マングースからバージョン4.13.8( npm install [email protected] --save )、および
  • MongoDBから3.4へ( db.version()入力してバージョンを確認できます)。

それは私のために働いた! :)

Mongoose 5は、この問題の影響を受けないはずです。 $pushAllどこにも使用されません。 マングース5でこのエラーが発生した場合は、コードサンプルの問題を開いてください:+1:

PS C:\ Users \ paula \ projetos \ apiNode \ src>ノードindex.js
{MongoError:不明な修飾子:$ pushAll
Function.MongoError.create(C:\ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ error.js:31:11)
toErrorで(C:\ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ utils.js:139:22)
C:\ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ collection.js:1059:67
C:\ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ connection \ pool.js:469:18にあります
_combinedTickCallback(internal / process / next_tick.js:131:7)で
process._tickCallback(internal / process / next_tick.js:180:9)で
名前: 'MongoError'、
メッセージ: '不明な修飾子:$ pushAll'、
ドライバー:本当、
インデックス:0、
コード:9

みなさん、こんにちは。エラーの修正方法を教えてください不明な修飾子:$ pushAll

Пробовалвоттакнеработает
const mongoose = require( 'mongoose')
constСхема= mongoose.Schema

const UserSchema =新しいスキーマ({
telegramId:{
タイプ:番号、
必須:true、
usePushEach:true
}、

映画:{
タイプ:[文字列]、
ディフォルト: []
}
})

mongoose.model( 'users'、UserSchema)

@ rivers-lis次のように、スキーマではなくスキーマオプションにusePushEachを追加する必要があります。

new Schema({ ... }, { usePushEach: true });

Кактовоттак
const mongoose = require( 'mongoose')
const Schema = mongoose.Schema

const UserSchema = new Schema({
telegramId:{
タイプ:番号、
必須:true
}、

films: {
    type: [String],
    default: []
}

})

new Schema({}、{usePushEach:true})

mongoose.model( 'users'、UserSchema)

new Schema({ ... }, { usePushEach: true });
これにより、バージョン4.4.12および5.0.7でもエラーが解決されます。

Кактовоттак
const mongoose = require( 'mongoose')
const Schema = mongoose.Schema

const UserSchema = new Schema({
telegramId:{
タイプ:番号、
必須:true
}、

films: {
    type: [String],
    default: []
}

})

new Schema({}、{usePushEach:true})

mongoose.model( 'users'、UserSchema)

申し訳ありませんがロシア語を読むことができません

@DanGDroidは大まかに「Кактовоттак」を翻訳しました->「このようなもの」

このページは役に立ちましたか?
0 / 5 - 0 評価