3

MongoDB の Projection について見つけたものはすべて読みました。これが単純であることを願っていますが、Mongo クエリの圧倒的な柔軟性のために見逃してしまいました。

私たちの MySql データベースでは、「非表示」フィールドの前にアンダースコアを付けるビジネス プラクティスを採用しています。私たちのアプリケーションは、これらのフィールドを非表示にする方法を知っています。

一部のデータを mongo に移動するには、ドキュメントを取得する必要があります。もちろん、これは検索後のドキュメント操作ではなく、クエリで行う必要があります。

$regex、$in、$all などのすべての演算子がに適用されるようです。名前に基づいて不明な数のフィールドを無視するプロジェクションを作成する必要があります。何かのようなもの:

db.coll.find({}, {"_*": 0})

もちろん、それは機能しませんが、アイデアを説明しています。

注: アプリケーション ユーザーがドキュメントを編集できるため、これが必要なため、スキーマがどのように見えるかわかりません。私たちの「内部」フィールドには_がプレフィックスとして付けられていることは知っていますが、それらはエディターからの省略によって保護する必要があります。

簡単だといいのですが...

4

3 に答える 3

1

hidden_fields別のフィールドをまたは何かとして持つことができます。次のスキーマを参照してください。

{_id: 'myid1', hidden_fields: {"_foo": "bar", "_foo2": "bar2"}, key1: value1 ...}

上記のスキーマに基づいて、次のようにします。

db.collection.find({ ... }, {hidden_fields: 1})

これにより、非表示のフィールドが表示されます。また、サブドキュメント内のフィールドにインデックスを付けることができるため、パフォーマンスの面でも損失はありません。

于 2012-12-12T22:13:49.933 に答える
0

正当な理由により、これには機能がありません。この種の機能を実装するのは悪夢であり、スケーリングも非常に高速でもありません。

現在これを行う最善の方法は、次のようなキー値ストアを設定することです。

{
    fields: [
        {k: "_ghhg", v: 5},
        {k: "ghg", v: 6}
    ]
}

次に$regexkフィールドで、どのキー名 (フィールド) にアンダースコアが含まれているかを理解します。

アドバイスとして、プレフィックス付き$regexの s を強くお勧めします。これは、作成したインデックスを使用する際、つまり、表示するクエリに対してより効果的であるためです^_*

一部のデータを mongo に移動するには、ドキュメントを取得する必要があります。すべてのアンダースコアのプレフィックス付きフィールドは省略されています。もちろん、これは検索後のドキュメント操作ではなく、クエリで行う必要があります。

私は個人的にこのクライアント側を行います。データベース側よりも 100 倍高速になります。

于 2012-12-12T22:00:08.810 に答える
0

@Sammaye が述べたように、MongoDB はこのタイプのクエリを自然で効率的な方法でサポートしていません。

ただし、常に内部データが必要なわけではない場合にパフォーマンスを最適化するには、2 つのドキュメントを作成することを検討することをお勧めします。MongoDB の読み取りと書き込みが少なくなり、クライアントでの操作が少なくなります。これは、RDBMS に 2 つのテーブル (1 つは公開データ、もう 1 つは非公開データ) を持つことに似ています。

これにより、ドキュメント全体を更新するだけで、非内部データの更新も簡単になります (シナリオで可能であれば)。

もちろん、不要な文字を BSON データに追加するだけなので、余分な「_」文字を削除することもできます。:)

于 2012-12-12T22:50:22.497 に答える