0

質問を率直にさせてください。OK、私は次のようなドキュメント構造を持っています

コレクション名をサンプルにします。

私は someIdAsString を知らなかったでしょう。

{
_id : ObjectId("someObjectId"),
test : {
    someIdAsString : {
        field1 : value1,
        field2 : value2
    },
            someOtherIdAsString : {}
            .....
            .....
            And so on
  }
}

field1 と field2 の値があります。この情報を使用してコレクションをクエリするにはどうすればよいですか。

field1 & field2 は実行時に認識されます。たとえば、field1 = '33' & field2 = '3333' であり、ドキュメントは次のようになります。

{
_id : ObjectId("522182515f8wea670900001b"),
test : {
    522182515f8c4wd70900001b : {
    field1 : '33',
    field2 : '3333'
    },
        522182515f8cea670900001b : {}
        .....
        .....
        And so on
   }
}

ありがとう

4

1 に答える 1

1

someIdAsStringこのテキストがキーではなく値になり、オブジェクトtestがオブジェクトのリストになるように、スキーマを変更することをお勧めします。すべてのキーを知っている場合は、試すことができます

db.sample.find({$or: [
    {"test.someIdAsString.field1": value1,
     "test.someIdAsString.field2": value2},
    {"test.someOtherIdAsString.field1": value1,
     "test.someOtherIdAsString.field2": value2},
    ...
]})

すべての「someIdAsString」の可能性について。

構造を次のように変更した場合:

{
    _id : ObjectId("someObjectId"),
    test : [
        {
            _id : someIdAsString,
            field1 : value1,
            field2 : value2
        },
        {
            _id : someOtherIdAsString,
            field1 : value3,
            field2 : value4
        },
        ...
    ]
}

クエリを次のように変更できます。

db.sample.find({
    "test.field1": value1,
    "test.field2": value2
})

埋め込まれたキー名を知らずにデータ構造を使用しながらクエリを使用する回避策は、$where 演算子の JavaScriptです。

db.sample.find(function(){
    var ttk;
    var tt = this.test;
    for(key in tt){
        ttk = tt[key]
        if(ttk.field1 === value1 && ttk.field2 === value2){
            return true;
        }
    }
    return false;
})
于 2013-08-31T06:54:34.240 に答える