3

DB で最も一致するドキュメントを返すクエリを作成したいと考えています。

つまり、「animal」:「dog」「color」:「brown」「pattern」:「dots」「size」:「small」というフィールドを持つドキュメントを検索したいと考えています。

上記のすべてのフィールドとそれに対応する値を含むドキュメントがない場合、クエリで最も一致するものを返したいと思います。fe {"動物":"犬", "色":"茶色", "サイズ":"小"}

mongo db で再帰クエリを実装できますか? もしそうなら、どのように?mapReduce を使用する必要がありますか? この問題は、指定された値に最も適したアイテム(ドキュメント)で推奨したい方法で、推奨システムの問題と考えることができます。誰かが上記を実装する良い方法を知っていれば幸いです

私はmongodb mongooseとnodejsを使用しています。

ありがとうございました。

4

2 に答える 2

2

再帰クエリのパフォーマンスへの影響についてはわかりませんが、このようなものはうまくいくはずです。クエリから最後のプロパティを削除し、一致が見つからない場合は再試行します。

var AnimalSchema = new mongoose.Schema({
    atype: { type: String },
    color: {type:String},
    pattern: {type:String},
    size : {type:String}
});

var Animal = mongoose.model('Animal',AnimalSchema);

//test data
//var dalmation = new Animal({
//    atype:'dog',
//    color: 'black and white',
//    pattern: 'spots',
//    size: 'big'
//});

//dalmation.save(function(err){
//    var yorkie = new Animal({
//        atype:'dog',
//        color:'brown',
//        pattern:'mixed',
//        size:'small'
//    });
//    yorkie.save(function(yer){
//         bestMatch({'atype':'dog','size':'big','color':'brown'},function(err,animal){
//             console.log(err,animal);
//         })
//    });
//});

function bestMatch(params,cb){
    Animal.findOne(params,function(err,animal){
        if (err || !animal){
           var keys = Object.keys(params);
           if (keys.length){
               delete params[keys.pop()];
               bestMatch(params,cb);
           }else{
               cb('No matches',null);
           }
        }else{
            cb(null,animal);
        }
    });
}

bestMatch({'atype':'dog','size':'big','color':'brown'},function(err,animal){
    console.log(err,animal);
});
于 2013-04-07T15:19:16.687 に答える
1

テキスト フィールドのみを検索しているように見える場合、1 つの可能性は、MongoDB 2.4の新しい (現在は「実験的」な)テキスト検索機能を使用することです。これにより、関連性のためのフィールドの重み付けを含め、1 つ以上のフィールドに全文索引を作成できます。

例えば:

db.collection.ensureIndex(
    // Fields to index
    {
        animal:  "text",
        color:   "text",
        pattern: "text",
        size:    "text"
    },

    // Options
    {
        name: "best_match_index",

        // Adjust field weights (default is 1)
        weights: {
            animal: 5,  // Most relevant search field
            size:   4   // Also relevant
       }
    }
)

結果は、関連付けられたフィールドの重みに基づくスコアリングで、関連性の高い順に返されます。

検索キーワードも語幹化されていることに注意してください。そのため、完全一致を期待している場合、予期しない結果が生じる可能性があります。用語を二重引用符で囲むと、フレーズ一致を利用してより具体的な一致を得ることができます。

于 2013-04-08T08:35:35.870 に答える