我在mongodb collection“Contact”中有以下文档结构。有一个名为“numbers”的子文档数组:
{
"name" : "Bill",
"numbers" : [
{
"type" : "home",
"number" : "01234",
},
{
"type" : "business",
"number" : "99099"
},
{
"type" : "fax",
"number" : "77777"
}
]
}
当我只想查询“home”和“business”数字时,我可以在mongodb-shell中执行类似的操作:
db.Contact.find({ numbers: { $elemMatch: {
type : { $in : ["home", "business"]},
number: { $regex : "^012" }
}}});
但是如何在吗啡中做到这一点?有什么办法吗?
我理解morphia支持“$ elemMatch”。所以我可以这样做:
query.filter("numbers elem", ???);
但是我究竟如何为子文档添加组合查询?
答案 0 :(得分: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());
答案 1 :(得分:0)
请考虑使用jongo,而不是使用morphia。它允许您在使用MongoDB shell时查询MongoDB。此外,在映射数组元素时,它将为您提供更多自由。以下是jongo的示例:
contacts_collection.find("{numbers : {$elemMatch: {
type: {$in :#},
number: {$regex: #}
}
}
}",
new String[]{"home", "business"}, "^012")
.as(Contact.class);
请注意,如果您只需要数组中的单个数字对象(或多个),则可以使用自定义结果映射器/处理程序。您只需将 .as(Contact.class)替换为:
.map(new ResultHandler<Number>() {...})
如需完整示例,请查看我的blog post或GitHub repository