1

MongoDB に次のような構造のドキュメントがあります。

{ _id : 1, tokens : [ "one","two","three","four","five","six","seven" ] }
{ _id : 2, tokens : [ "two","three","four","one","one","five","eight" ] }
{ _id : 3, tokens : [ "six","three","four","five","one","five","nine" ] }

平均して、ドキュメントには 4500 項目の長さのトークン配列が含まれています。

正確に一致する順序でトークンの配列がある場合、ある種のパターンマッチングを行う必要があります。つまり、正確に一致する順序で次のものを見つける必要があるとしましょう...

["three","four","five"]

...クエリで次のドキュメントを取得したい...

{ _id : 1, tokens : [ "one","two","three","four","five","six","seven" ] }
{ _id : 3, tokens : [ "six","three","four","five","one","five","nine" ] }

つまり、両方のドキュメントには、検索するために配列にあったアイテムの正確な順序が含まれています。

私が検索する配列の長さは、1 から 15 トークンの範囲で異なる場合があります。

私は次のものを探しています:

  • これは MongoDB クエリで実行できますか? 私はかなり良いドキュメントを読み、読み直し、読み直しましたが、$all を使用するなどの解決策を見つけることができませんでした。
  • 私が必要とすることを成し遂げるために、このようなトークンを保存するためのより良い方法はおそらくありますか?

助けてくれてありがとう。

4

1 に答える 1

0

$where遅くなりますが、演算子を使用してこれを行うことができます。$allパフォーマンスを向上させるためにオペレーターとペアリングします。

db.test.find({
    tokens: {$all: ["three","four","five"]},
    $where: function() {
        var ix = -1;
        // Find each occurrence of 'three' in this doc's tokens array and return
        // true if it's followed by 'four' and 'five'.
        do {
            ix = this.tokens.indexOf('three', ix + 1);
            if (ix !== -1 && ix+2 < this.tokens.length && 
                this.tokens[ix+1] === 'four' && this.tokens[ix+2] === 'five') {
                return true;
            }
        } while (ix !== -1);
        return false;
    }
})
于 2013-01-04T00:47:01.803 に答える