Morphia查询过滤和获取嵌入的列表元素

时间:2015-06-30 07:44:27

标签: mongodb morphia

我是NoSQL和morphia的新手。我正在使用Morphia来查询MongoDB。

我有一个样本集,如下所示:

[
    {
        "serviceId": "id1",
        "serviceName": "ding",
        "serviceVersion": "1.0",
        "files": [
            {
                "fileName": "b.html",
                "fileContents": "contentsA"
            },
            {
                "fileName": "b.html",
                "fileContents": "contentsB"
            }
        ]
    },
    {
        "serviceId": "id2",
        "serviceName": "ding",
        "serviceVersion": "2.0",
        "files": [
            {
                "fileName": "b.html",
                "fileContents": "contentsA"
            },
            {
                "fileName": "b.html",
                "fileContents": "contentsB"
            }
        ]
    }
]

我想使用Morphia在“文件”列表中获取一个元素,给出服务名称,服务版本和文件名。

我能够使用下面的查询得到我想要的东西:

db.ApiDoc.find({ serviceName: "ding", serviceVersion: "2.0"}, { files: { $elemMatch: { fileName: "b.html" } } }).sort({ "_id": 1}).skip(0).limit(30);

到目前为止我尝试了什么:

我尝试使用morphia的“elemmatch”api,但没有运气。

query =  ...createQuery(
                    Result.class);
query.and(query.criteria("serviceName").equal("ding"),
                    query.criteria("serviceVersion").equal(
                            "2.0"));
query.filter("files elem",BasicDBObjectBuilder.start("fileName", "a.html").get());

我似乎得到了包含所有文件的整个Result集合。我想只得到匹配的文件(按文件名)。

有人可以帮我解决这个问题吗?

由于 RAJESH

2 个答案:

答案 0 :(得分:0)

我不相信可以获得匹配的子元素。您可以要求拥有'文件'返回了数组,但所有元素都将包含在结果集中,您必须在代码中重新过滤。

另一个选项是使用serviceId字段使Files成为自己的集合,然后您将有更多权力加载某些文件。

答案 1 :(得分:0)

可以这样做。 过滤器的作用并不像投影一样。

尝试:

datastore.createQuery(Result.class)
.field("serviceName").equal("dong")
.field("serviceVersion").equal("2.0")
.field("files.filename").equal("a.html")
.project("files.$.filename", true);