Morphia:使用Morphia在ArrayList中过滤元素

时间:2015-11-09 20:35:49

标签: java mongodb morphia

我有一个名为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"
}

1 个答案:

答案 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.$");