1

サブシーケンスでドキュメントを検索できるようにしたい。

例えば

{
  "name": "doc1",
  "sequence": ["a", "b", "d", "g", "k"]
}
{
  "name": "doc2",
  "sequence": ["c", "a", "b", "m", "d"]
}

複数のアイテムを順番に一致させたい。クエリの例:

  1. シーケンス["a"、"b"]を持つすべてのドキュメントを返します。(doc1とdoc2を返します)
  2. 「a」があり、3つの位置の後に「d」があるすべてのドキュメントを返します(doc2を返します)
  3. シーケンス["b"、 "d"、 "(whatever)"、 "k"]を持つすべてのドキュメントを返します(doc1を返します)

MongoDBでこれを実行できるかどうかはわかりません。別の解決策は、シーケンスを配列ではなく文字列として保存し、正規表現を使用することです(ただし、その解決策はあまり好きではありません)。

MongoDBでそれを実行できない場合、別のnoSqlエンジンまたはこれをサポートするエンジンはありますか?

4

2 に答える 2

1

他の答えが言うように、MongoDBでは注文atmで検索することはできません。

ただし、マテリアライズドパスはシーケンスを探すのに非常に適しています:http ://docs.mongodb.org/manual/tutorial/model-tree-structures/#model-tree-structures-with-materialized-pathsここで機能する可能性があります。

したがって、シーケンスフィールドの「パス」を持つ2番目のフィールドがあります。

{
  "name": "doc2",
  "seq_path": "c,a,b,m,d",
  "sequence": ["c", "a", "b", "m", "d"]
}

また、事前に固定された正規表現(インデックスを使用できます)を使用して、次の検索を行うことができます。

db.col.find({seq_path:/^c,a,b,m,d$/})

または、ドキュメントがそのシーケンスで始まる場所を見つけるには:

db.col.find({seq_path:/^c,a,b/})

これは一方向かもしれません。

于 2013-02-08T11:58:50.220 に答える
0

では不可能だと思います。

まず、特定の要素を取得するのは簡単ではありませんが、$ elementMatchを使用して取得できますが、私が見る限り、ネイバーの値を取得する方法はありません。

文字列を使用することをお勧めします。の例でそれを試しました、そしてそれはうまくいきます。

#!/usr/local/bin/perl

use strict;
use warnings;
use MongoDB;
use Data::Dumper;

my $client     = MongoDB::Connection->new(host => 'localhost', port => 27017);
my $database   = $client->get_database('oho');
my $documents = $database->get_collection('documents');

$documents->remove();

my $doc1 = {  "name"     => "doc1",
              "sequence" => ["abdgk"]
           };

my $doc2 = {
             "name"      => "doc2",
             "sequence"  => ["cabmd"]
           };

$documents->insert($doc1);
$documents->insert($doc2);

my @case1 = $documents->find( { "sequence" => qr/ab/i } )->all();
print "case 1:" . Dumper \@case1;

my @case2 = $documents->find( { "sequence" => qr/a..d/i } )->all();
print "case 2:" . Dumper \@case2;

my @case3 = $documents->find( { "sequence" => qr/bd.*k/i } )->all();
print "case 3:" . Dumper \@case3;
于 2013-02-08T11:08:31.617 に答える