3

Mongoose で次のスキーマを定義しました。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;

var New = new Schema({
    _id: ObjectId,
    lang: String,
    formatted: Boolean,
    downloaded: Date,
    content: {
        title: String,
        link: String,
        description: String,
        meta: String,
        author: String
    }
});

module.exports = New;

そして、次のクエリを実行しようとしています。

NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);

クエリは応答せず、コールバック関数に入りません。このタイプのクエリ (2 つの文字列フィールドへの検索) は、私が定義した別のスキーマではうまく機能しますが、このスキーマでは機能しないため、奇妙なことです。他のスキーマは、ドキュメントが埋め込まれていないため、より単純です。

奇妙なことに、次のように動作します。

NewsModel.find({'lang':'en', 'formatted':true}).exec(callback);

スキーマエラーはありますか? 私が間違っていることは何ですか?

どうもありがとうございました、

ルイス・カッパ


[更新しました]

私はあなたの提案を試みましたが、方法はありません。次の 2 つのオプションしかないと思います。

1.投稿したスキーマに問題があります。

2. Mongoose には、別のドキュメントなどの複雑なパラメータが埋め込まれたドキュメントへのクエリに問題があります。

私は MongoDB シェル、MongoDB Java ドライバー、および Spring MongoDB データを使用してきましたが、この奇妙な動作を経験したのはこれが初めてです。

私がテストしたクエリは次のとおりです。

NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);
NewsModel.find({'lang':'en'}).where('content.link').equals('test').exec(callback);
NewsModel.find({'content.link':'test'}).where('lang').equals('en').exec(callback);
NewsModel.find({'content.link':'test'}).exec(callback); //  That demonstrates that Mongoose has problems with subelements.
NewsModel.find().where('content.link').equals('test').exec(callback); // This one too.

そして、MongoDB シェルで完全に動作する 1 つの例:

db.news.find({ 'content.link': /test/, lang: 'en' })

私は、Mongoose がゼロの結果で空の応答を返さないことを心配しています。代わりに、待機して応答を待機することでアプリケーションを待機状態に維持し、コールバック関数には決して入りません。

何か案は?似たようなことを経験しましたか?

どうもありがとう!

4

4 に答える 4

2

解決済み

Mongoose でのクエリ パフォーマンス エラーでした。クエリを実行する約 10 万のドキュメントを含むテスト コレクションがあり、'lang' と 'content.link' を使用して複合インデックスを定義していません。クエリの遅延が大きすぎたため、Mongoose または MongoDB はタイムアウトの警告やエラー メッセージを警告しませんでした。複合インデックスを定義した後、クエリは正常に機能しましたが...

  1. クエリは、MongoDB シェルで実行しても問題なく動作しました。なぜマングースが遅かったのかはわかりません。おそらく、シリアライズ - デシリアライズ - 関係するプロセスの検証によって、その遅延が発生した可能性があります。

  2. インデックスが定義されていなくても、100,000 ドキュメントしかない単純なテスト コレクションで、単純なクエリのパフォーマンスがこれほど低いとは信じられません。MongoDB 自体は、クエリと応答をすばやく処理するために多くのリソースを消費します。正直なところ、MongoDB - Mongoose にはもっと期待していました。

私の提案/アドバイス:

インデックスの構成に注意してください。

クイック検索が必要な場合は、任意の Node.js Apache Solr モジュールを参照してください。

于 2012-09-03T11:37:29.197 に答える
0
NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback); 

'content'ではなく'content.link'という名前のフィールドを見つけようとしている可能性があります。

NewModel.where('lang').equals('en')  
        .where('content').link.equals('test') 
        .exec(callback)
于 2012-08-31T16:22:39.563 に答える
0

したくないですか

NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);

埋め込みドキュメントをクエリするには?

この回答を参照してください:

Mongoose、Node.js、MongodDB の特定のプロパティによる埋め込みドキュメントの検索

于 2012-08-31T15:18:55.627 に答える
0

最初のクエリでは、リンク属性がドキュメントの「ルート」にないため、「リンク」ではなく「content.link」を検索したいとします (現在のマングース バージョンが「. " 埋め込みドキュメント内の何かを検索するため)

于 2012-08-31T15:12:50.907 に答える