我是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
答案 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);