web-dev-qa-db-ja.com

MongoDBのallowDiskUseが機能しない。

専門家。

私はMongoDBを使い始めたばかりですが、自分をトラブルに巻き込むのに十分な知識があります。

db.test.aggregate(
[
    {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
    {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
    {$match: {cnt: 2}}
], 
    {allowDiskUse : true}
)

そして、どのようなバリエーションを試しても、同じエラーが発生し続けます( "Pass allowDiskUse:true to opt in"):

Error( "Printing Stack Trace")@:0()@ src/mongo/Shell/utils.js:37([object Array]、[object Object])@ src/mongo/Shell/collection.js:866 @(シェル):7

キャッチされない例外:集計に失敗しました:{"errmsg": "例外:mongo1.mscnet.com:27017からの応答でエラーを受信しました:{$ err:\" $ groupのメモリ制限を超えましたただし、外部を許可していませんソート。allowDiskUse:trueを渡してオプトインします。\"、code:16945}"、 "code":16945、 "ok":0}

参考:Mongo 2.6を使用しています

12
Eyal Zinder

Runコマンドで集約クエリを使用してください。allowDiskUseタグを使用できます。

db.runCommand(
   { aggregate: "test",
     pipeline: [
                {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
                {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
                {$match: {cnt: 2}}
               ],
     allowDiskUse: true
   }
)
18
Dineshaws

このように書いてみてください

db.stocks.aggregate([
                     { $project : { cusip: 1, date: 1, price: 1, _id: 0 } },
                     { $sort : { cusip : 1, date: 1 } }
                    ],
                     {
                       allowDiskUse: true
                     }
                    ); 

後もう一つ、
最大ドキュメントサイズに関するエラーは、Mongoに固有のものです。 Mongoは、16メガバイトを超えるドキュメント(またはその配列)を返すことはできません。データサイズについて何も言及しなかったので理由はわかりませんが、おそらく最終結果として作成しているドキュメントが大きすぎることを意味します。 $ limitパラメータを減らしてみてください。最初に1に設定してテストを実行し、それを増やして、それを実行したときの結果の大きさを確認します。

7
MAULIK MODI

MongoDB Atlasのm10以降バージョンを使用している場合、以下は{allowDiskUse: true};の修正です。mongooseを介してアプリケーションからデータにアクセスしている場合、関数としての構文である必要があります。例えば:

MongoDbクエリ:

db.collection.user.aggregate([], {allowDiskUse: true})

マングースで:

User.aggregate([]).allowDiskUse(true);

これはアプリケーションからのエラーを解決します:)

1
pushpak