伙计们我有几个问题:
Q1.我使用Play 1.1.1与Morphia-MongoDB模块和ElasticSearch进行索引.有没有人试过这个?
Q2.出于某种原因,morphia插件(版本beta4和beta5)在ObjectIdBinder类中出错.显然它不喜欢绑定方法上的@Override.有没有其他人面对这个?修复是什么?
我有以下Play Framework实体(使用Morphia进行持久化)作为通用博客应用程序的一部分:
@Entity
public class Comment extends Model {
...
@Reference
@Indexed
public SiteUser commenter;
public static List<Comment> getLastCommentsByUsers(final List<SiteUser> users) {
final Query<Comment> query ds().createQuery(Comment.class);
query.field(commenter).hasAnyOf(users);
return query.asList();
}
}
Run Code Online (Sandbox Code Playgroud)
SiteUser:
@Entity(noClassnameStored=true)
public class SiteUser extends AbstractUser {
public String realName;
}
Run Code Online (Sandbox Code Playgroud)
AbstractUser:
public class AbstractUser extends Model {
@Indexed(value= IndexDirection.DESC, unique = true)
public String emailAddress;
@Required
public String password;
}
Run Code Online (Sandbox Code Playgroud)
该方法getLastCommentsByUsers()应该返回users参数中用户的所有注释,但我总是得到一个空的List.这Commment是一个单独的集合的原因是能够Comment通过其关联的Posts 检索某些用户的最后X ,如果Comment嵌入在 …
这是我第一次使用DAO模式.从我到目前为止所读到的,实现这种模式将帮助我从任何持久性实现中分离我的调用代码(控制器) - 正是我想要的; 也就是说,我不想被重新使用任何特定的数据库或第三方库.
我正在使用MongoDB和morphia(作为示例)创建一些测试代码(以TDD方式),使用morphia提供的BasicDAO类.
据我所知,扩展BasicDAO<T, V>需要一个接受Morphia和Mongo对象的构造函数; 这些是非常具体的(第三方)类型,我真的不想在DAO类本身之外浮动.
我怎样才能拥有更多可插拔架构?我的意思是,我应该考虑如何配置我的应用程序以使用具有特定配置参数的特定DAO,在实际源外部?
我刚刚分析了一些代码,我用以下代码增加了一些频率计数器:
Datastore ds = ...
final Query<Unit> query = ds.createQuery(Unit.class);
query.field("text").equal(text);
query.field("langCode").equal(lang.getCode());
UpdateOperations ops = ds.createUpdateOperations(Unit.class);
ops.inc("frequency", value);
ds.update(query, ops, false);
Run Code Online (Sandbox Code Playgroud)
查询的创建花费了近50%的执行时间,我想以某种方式重用该工作.将文件query和ops对象保存在ThreadLocal中是否安全,只需query.field("text").equal(text)再次调用 以替换"文本"字段?它看起来似乎验证占总时间的约30%.
我正在尝试使用一致的数据库,其中用户名和电子邮件是唯一的.
http://www.mongodb.org/display/DOCS/Indexes#Indexes-unique%3Atrue
http://code.google.com/p/morphia/wiki/EntityAnnotation
我的用户类看起来像这样:
public class User {
@Indexed(unique = true)
@Required
@MinLength(4)
public String username;
@Indexed(unique = true)
@Required
@Email
public String email;
@Required
@MinLength(6)
public String password;
@Valid
public Profile profile;
public User() {
...
Run Code Online (Sandbox Code Playgroud)
我使用@Indexed(unique = true)注释但它不起作用.我的数据库中仍有重复项.
我有什么想法可以解决这个问题?
编辑:
我读到了关于ensureIndexes但这似乎是一个错误的方法,我不想上传重复数据,只是为了看到它真的是重复.
我想立刻阻止它.
有点像
try{
ds.save(user);
}
catch(UniqueException e){
...
}
Run Code Online (Sandbox Code Playgroud) 我希望能够在MongoDB集合中持久存储并检索地图图.我正在使用Java通过Morphia访问MongoDB.
我在下面使用的示例是一个集合,其中包含详细说明各种车辆所有者的文档.在该示例中,特定品牌和型号的车辆数量存储在地图地图中
大多数属性都没有遇到任何问题,但对于属性是以下列方式定义的地图的映射:
@Property("vehicles")
private Map<String, Map<String, Integer> vehicles = new HashMap<String, HashMap<String, Integer>>();
Run Code Online (Sandbox Code Playgroud)
创建对象(一些值插入到地图中)并持久保存到Mongo数据库,就像人们期望的那样:
"vehicles" : {
"FORD" : {
"FIESTA" : 1
},
"TOYOTA" : {
"COROLLA" : 1,
"PRIUS": 1
},
"BMW" : {
"SLK" : 1
}
}
Run Code Online (Sandbox Code Playgroud)
但是当通过java代码检索对象时(MongoDB控制台上的查询按预期工作))以下列方式...
Query<Owner> q = ds.find(Owner.class);
System.out.println(q.countAll());
Iterable<Owner> i = q.fetch();
for (Owner o : i) {
System.out.println(o);
}
Run Code Online (Sandbox Code Playgroud)
......代码在q.fetch()行上以可怕的方式死亡.
请帮忙 :)
我正在寻找一种方法来获取给定集合中特定元素的前两个(或任何其他数量)计数.
{"id": "xyz" , "fruits": ["Apple", "Mango"]}
{"id": "abx", "fruits": ["Apple", "Banana"]}
{"id" : "pqr", "fruits": ["Apple", "Mango"]}
Run Code Online (Sandbox Code Playgroud)
对于上面的例子,结果将是:Apple and Mango因为Apple(三次)的出现更高,然后是Mango(两次).我需要使用Mongo map-reduce功能吗?
我更倾向于后端平台的性能和稳定性.如果"发生次数"实时发生,我该如何前进?
任何帮助都会很明显.
我的MongoDB中有两种文档:客户端和代码.每个代码都指一个客户端.客户端必须由管理员显式存储,因此我必须将它们分开存储,并且不能将它们放入代码文档中.
code -> client
Run Code Online (Sandbox Code Playgroud)
现在,MongoDB/Morphia将客户端的技术ID保存为ObjectId,而代码则引用技术ID为String类型的客户端.我能够通过给定的客户端ID搜索代码,但在运行时我会收到错误消息,因为Morphia无法注入客户端.我认为这是因为不同的id类型.
code { client.$id: String }
client { _id: ObjectId }
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这一问题?
例外
com.google.code.morphia.mapping.MappingException:无法为org.example.Code.client获取引用({"$ ref":"clients","$ id":"123456789abcdef"})
在互联网上我发现了异常消息.有人建议在模型中使用ObjectId而不是String,但我需要使用String.这不是我自己的项目.
实体:
@Entity("codes")
public class Code implements Comparable<Code> {
@Id
private String id;
@Reference
private Client client;
[...]
}
@Entity("clients")
public class Client {
@Id
private String id;
}
Run Code Online (Sandbox Code Playgroud)
储存:
存储我使用的对象com.google.code.morphia.dao.DAO.save(T entity).
搜索:
public class CodeRepository extends BasicDAO<Code, String> {
[... constructor ...]
@Override
public Code findByCode(String type, String clientId, String code) {
return findOne(createQuery()
.field("type")
.equal(type)
.field("value") …Run Code Online (Sandbox Code Playgroud) 如何从具有条件的集合中获取不同的值?
例如,我有Worker类,它包含status和workerId以及其他字段,这里我想要检索其中status ="ACTIVE"的不同workerId;
我已经做了足够的谷歌搜索,但找不到任何解决方案
任何帮助,将不胜感激
提前致谢!
编辑
对不起家伙我没有正确地提出我的问题.我希望使用morphia而不是使用mongodb本机查询来完成此操作.
可以使用MapReduce完成吗?请帮帮我!
当写入文件Mongodb使用Morphia,这样的结构将被写入没有任何问题,并没有需要的@Embedded注释:
@Entity
public class Blog {
@Id
private String id;
private List<Comment> comments;
}
Run Code Online (Sandbox Code Playgroud)
该comments字段被愉快地存储为嵌套Comment元素数组(Comment是一个没有注释的普通 POJO)。
但是,Morphia文档建议我应该使用它:
@Entity
public class Blog {
@Id
private String id;
@Embedded
private List<Comment> comments;
}
Run Code Online (Sandbox Code Playgroud)
但是在我的测试中,使用@Embedded注释似乎并没有比简单地编写没有注释的结构做任何额外的事情。
那么@Embedded注解实际上是做什么的呢?除了简单地写入数据之外,它是否会影响查询、索引或其他一些存储功能的能力?