2017-04-25 24 views
1

このmongoクエリの構築が必要です。mongodbを使用して埋め込みドキュメントを照会する方法

> db.versions_20170420.findOne(); 
{ 
    "_id" : ObjectId("54bf146b77ac503bbf0f0130"), 
    "account" : "foo", 
    "labels" : { 
     "1" : { 
      "name" : "one", 
      "color" : "color1" 
     }, 
     "2" : { 
      "name" : "two", 
      "color" : "color2" 
     }, 
     "3" : { 
      "name" : "three", 
      "color" : "color3" 
     } 
    }, 
    "profile" : "bar", 
    "version" : NumberLong("201412192106") 

: これまでのところ、私は最初のレベルで照会することができますが、次の組み込みのレベル(「ラベル」> 2" )でそうすることができませんでし

例えば、文書構造は次のようになりますこのクエリ私は、最初のレベル(account, profile)でフィルタリングすることができます。

db.profile_versions_20170420.find({"account":"foo", "profile": "bar"}).pretty() 

しかし、このような構造を考えると、私は>"2""label"文書を探しています。"2"は数あるようにそれは見ていません、しかし文字列。それを行うためのmongoクエリを構築する方法はありますか?変換を行う必要はありますか?

答えて

1

私が正しく"label" > "2"は、オブジェクトのラベルがプロパティlabels.3を含まなければならないことを意味し、あなたとあなたのデータ構造を理解し、次のコードでチェックすることは容易である場合:

db.profile_versions_20170420.find(
    {"account": "foo", "profile": "bar", "labels.3": {$exists: true}} 
).pretty(); 

しかし、それはあなたのオブジェクトという意味ではありません配列内の要素数を計算する関数$sizeではないため、labelsはオブジェクトではないため、$ sizeを使用することはできません。したがって、我々の場合、labelsは、ラベルが含まれている唯一のプロパティであっても、3のプロパティを持つことがわかります。

あなたは基準を見つける向上させることができます

db.profile_versions_20170420.find({ 
    "account": "foo", 
    "profile": "bar", 
    "labels.1": {$exists: true}, 
    "labels.2": {$exists: true}, 
    "labels.3": {$exists: true} 
}).pretty(); 

をしてlabesは要素1, 2, 3が含まれているが、この場合には、ドキュメント内のデータを削除/挿入/更新時にアプリケーションレベルでオブジェクト構造を気にしていることを確認してください。別の選択肢として、あなたはあなたのDBを更新し、余分なフィールドlabelsConutを追加し、その後、あなたがこのようなクエリを実行することができますすることができます

db.profile_versions_20170420.find(
    {"account": "foo", "profile": "bar", "labelsConut": {$gt: 2}} 
).pretty(); 

ところで、それはより速く動作しますが...

関連する問題