我有一个名为Project的Java类,其users
ArrayList<User>
属性包含用户对象。
我的项目集合看起来像
[
{
"_id" : ObjectId("56410150d277de02f3b67495"),
"name" : "my-project",
"users" : [
{
"id" : "58b5eb81-35b2-4719-87ad-e5eea76a478f",
"name" : "john",
"lastName" : "Doe"
}
]
}
]
我想在此属性中找到具有特定UUID的用户。我可以使用以下查询在MongoDB中找到它:
db.getCollection('projects').find({"users.id": "58b5eb81-35b2-4719-87ad-e5eea76a478f"})
如何使用Morphia获得相同的结果?
我试过这个:
Project project = datastore.createQuery(Project.class).filter("users.id", user_id).get();
而且:
Project project = datastore.find(Project.class, "users.id", user_id).get();
但没有运气:(
任何帮助?
我希望得到:
{
"id" : "58b5eb81-35b2-4719-87ad-e5eea76a478f",
"name" : "john",
"lastName" : "Doe"
}
答案 0 :(得分:0)
使用 $elemMatch
投影来检索数组。要生成的mongo查询是有限的
db.project.findOne(
{"users.id": "58b5eb81-35b2-4719-87ad-e5eea76a478f"},
{
"_id": 0,
"users": {
"$elemMatch": { "id": "58b5eb81-35b2-4719-87ad-e5eea76a478f" }
}
}).users[0]
或使用 $ projection
运算符,该运算符根据查询语句中的某些条件投影数组元素。在您的情况下,您的查询语句将使用点表示法来查询至少包含元素的Images数组:
db.project.findOne(
{"users.id": "58b5eb81-35b2-4719-87ad-e5eea76a478f"},
{ "_id": 0, "users.$": 1 }
).users[0];
在Morphia(未经测试)中,您可能需要尝试 elem
运算符
Project project = datastore.createQuery(Project.class)
.filter("users elem", BasicDBObjectBuilder.start("id", "58b5eb81-35b2-4719-87ad-e5eea76a478f"))
.retrievedFields(true, "users.$")
.get();
或
Project project = datastore.createQuery(Project.class)
.field("users.id").eq("58b5eb81-35b2-4719-87ad-e5eea76a478f")
.retrievedFields(true, "users.$")
.get();
或流畅的界面 hasThisElement()
方法
User user = new User();
user.setId("58b5eb81-35b2-4719-87ad-e5eea76a478f");
Query<Project> query = datastore.createQuery(Project.class)
//.field("users.id").equal("58b5eb81-35b2-4719-87ad-e5eea76a478f")
.field("users").hasThisElement(user)
.retrievedFields(true, "users.$");