1

私はmongodbコレクション「Contact」に次のドキュメント構造を持っています。「numbers」と呼ばれるサブドキュメントの配列があります。

{
    "name" : "Bill",
    "numbers" : [
        {
            "type" : "home",
            "number" : "01234",
        },
        {
            "type" : "business",
            "number" : "99099"
        },
        {
            "type" : "fax",
            "number" : "77777"
        }
    ]
}

「自宅」と「会社」の番号のみを照会したい場合は、mongodb-shell で次のようにすることができます。

db.Contact.find({ numbers: { $elemMatch: { 
        type : { $in : ["home", "business"]}, 
        number: { $regex : "^012" }
}}});

しかし、モルフィアでこれを行う方法は? 何か方法はありますか?

「$elemMatch」が morphia でサポートされていることは理解しています。だから私は次のようなことができます:

query.filter("numbers elem", ???);

しかし、サブドキュメントの複合クエリを追加するにはどうすればよいでしょうか?

4

2 に答える 2

2

手遅れですが、他の人が便利だと思うかもしれません。

その解決策を見つけましたhttps://groups.google.com/forum/#!topic/morphia/FlEjBoSqkhg

query.filter("numbers elem", 
BasicDBObjectBuilder.start()
.push("type").add("$in", new String[]{"home", "business"}).pop()
.push("number").add("$regex", "^012").pop().get());
于 2015-04-23T09:08:16.253 に答える
0

morphia を使用する代わりに、 jongoの使用を検討してください。MongoDB シェルを使用していたように、MongoDB にクエリを実行できます。さらに、配列要素をマッピングする際の自由度が高まります。あなたの例が jungo でどのように見えるかは次のとおりです。

contacts_collection.find("{numbers : {$elemMatch: {
                                         type: {$in :#},
                                         number: {$regex: #}  
                                                  }
                                     }
                          }", 
                         new String[]{"home", "business"}, "^012")
                   .as(Contact.class);

配列から 1 つ (または複数) の数値オブジェクトのみが必要な場合は、カスタムの結果マッパー/ハンドラーを使用できることに注意してください。.as(Contact.class)を次のように置き換えるだけです。

.map(new ResultHandler<Number>() {...})  

完全な例については、私のブログ投稿またはGitHub リポジトリをご覧ください。

于 2013-10-13T10:49:17.147 に答える