3

MongoDBでは、

特定のフィールドを含むレコードを照会するには、次のようにします。

collection.find({'field_name1': {'$exists': true}})

そして、それは'field_name1'フィールドが設定されているすべてのレコードを返します。

しかし、mongoにクエリを実行して、「field_name1」のみを含む(他のフィールドを含まない)レコードを見つけるにはどうすればよいでしょうか。たとえば、フィールドのリストに対してこれを実行できるようにしたいと思います。

4

1 に答える 1

3

悲しい答えは、MongoDBや他のNoSQLデータベースでよく見られるように、データをできるだけ簡単にクエリできるようにデータを構造化するのがおそらく最善であるということです。

そうは言っても、これを行う方法はいくつかありますが、私が知る限り、JavaScriptサーバー側を実行する必要があります。これは遅くなり、MongoDBのインデックスやその他の論理機能を利用できない可能性があるため、パフォーマンスが非常に重要である場合は、絶対に必要な場合にのみ使用してください。

したがって、これを行う最も簡単な方法は、オブジェクト内のフィールドの数を返す関数を作成することです。これは、$where クエリ構文で使用できます。これにより、データに対して任意のJavaScriptクエリを実行でき、通常の構文クエリと組み合わせることができます。

悲しいことに、私のJavaScript-fuは少し弱いので、JSのオブジェクトのメンバーの数をワンライナーで取得する方法(またはその場合)がわからないので、これを行うために、機能サーバー側

mongoシェルから、以下を実行します。

db.system.js.save(
    {
        "_id" : "countFields", 
        "value" : function(x) { i=0; for(p in x) { i++; } return i}
    }
)

countFieldsこれで、オブジェクト内の要素の数を返す、呼び出されたサーバー側の保存されたJavaScript関数ができました。$where次に、クエリを使用して検索操作を実行する必要があります。

db.collection.find({
    'field_name1': {'$exists': True}, 
    '$where' : 'countFields(this)==2'
})

$existsこれにより、条件と$where条項の両方を満たすドキュメントのみが提供されます。関数はフィールドとしてcountFieldsカウントされるため、例では2と比較していることに注意してください。_id

于 2012-11-01T22:42:53.917 に答える