1

我在 mongodb 集合“联系人”中有以下文档结构。有一个称为“数字”的子文档数组:

{
    "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”。所以我可以做类似的事情:

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

考虑使用 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>() {...})  

有关完整示例,请查看我的博客文章或我的GitHub 存储库

于 2013-10-13T10:49:17.147 回答