4

返されるフィールドを定義するとき、mongoDB(collection.find(q, fields))は (どのように) フィールド名 (値ではなく) の比較をサポートしますか?

たとえば、値に関係なく、名前に基づいてフィールドの範囲を選択します。

ドキュメント内に次のフィールド (値が何であれ) があるとします。

fieldA000 fieldA001 fieldA002 fieldB000 fieldB001 fieldC000 ...

fieldA000 to fieldA999そして、フィールド名の一致(明示的にフィールド名を定義する必要なし)またはfieldA.*(reg ex)などの返されるフィールドを制限したいと思います。

PS: 私は現在、非常に使いやすい方法で column-range/slice-select が提供されている Cassandra の代わりに mongoDB を使用できるかどうかを評価しています。

4

2 に答える 2

3

Mongo には、正規表現のキー名を使用してドキュメントを照合する方法がありません。

ただし、$whereJavaScript の実行を使用して各ドキュメントを選択できるようにすることもできます。の欠点は$where、インデックスを利用できないことです。そのため、コレクション内のすべてのドキュメントを逆シリアル化する必要があり、ほとんどのアプリケーションにとって遅すぎる可能性があります。

Mongo でこれを行うもう 1 つの方法は$existsand を使用することです$orが、明示的なキー名が必要です。

このようなスキーマは、このタイプのクエリに対してより効率的であり、次を使用してサーバーでのスライスを容易にします$

{
    dataFields: [
        { id: 'A000', value: 'whatevs' },
        { id: 'A001', value: 'whatevs' },
        { id: 'A002', value: 'whatevs' },
        { id: 'B000', value: 'whatevs' },
        { id: 'B001', value: 'whatevs' },
        { id: 'C000', value: 'whatevs' },
    ]
}

また:

{
    dataFields: [
        { lettter: 'A', number: 0, value: 'whatevs' },
        { lettter: 'A', number: 1, value: 'whatevs' },
        { lettter: 'A', number: 2, value: 'whatevs' },
        { lettter: 'B', number: 0, value: 'whatevs' },
        { lettter: 'B', number: 1, value: 'whatevs' },
        { lettter: 'C', number: 0, value: 'whatevs' },
    ]
}
于 2013-04-17T14:00:02.420 に答える
0

MongoDB では、返されるフィールドを指定するすべてのクエリ操作でプロジェクションを提供できます。

パターンに基づいてフィールドを含めたり除外したりすることはできません。あなたができることは、含まれるフィールドをマークすることです:

db.foo.find({}, {'A000': 1, 'A001': 1, 'B000': 1})

(このクエリは、_id、A000、A001、および B000 フィールドを返します)。

または、除外する特定のフィールドをマークします。

db.foo.find({}, {'B000': 0})

(このクエリは、B000 を除くすべてのフィールドを返します)。

詳細については、このリンクを参照してください。

一般に、このようなプロジェクションを使用して列のスライスをシミュレートすることは、ドキュメント データベースの優れたユース ケースではありません。データは db サーバーからクライアントに返されませんが (ネットワークとクライアントの解析オーバーヘッドを節約できます)、それでもディスクから読み取る必要があり (カバリング インデックスを使用してすべてのフィールドを返すことができない場合)、除外する部分を決定するためにドキュメントを解析する必要があります。

于 2013-04-17T14:40:45.903 に答える