我选择的数据库是MongoDB.我正在编写一个数据层API来从客户端应用程序中抽象实现细节 - 也就是说,我实际上提供了一个单独的公共接口(一个充当IDL的对象).
我正在以TDD的方式测试我的逻辑.在每个单元测试之前,@Before调用一个方法来创建数据库单例,之后,当测试完成时,@After调用一个方法来删除数据库.这有助于提高单元测试之间的独立性.
几乎所有的单元测试,即执行上下文查询,都需要事先发生某种插入逻辑.我的公共接口提供了一个插入方法 - 然而,使用此方法作为每个单元测试的前驱逻辑似乎是不正确的.
我真的需要某种模拟机制,但是,我对模拟框架没有多少经验,而且Google似乎没有返回任何可能与MongoDB一起使用的模拟框架.
其他人在这些情况下做了什么?也就是说,人们如何单元测试与数据库交互的代码?
此外,我的公共接口连接到外部配置文件中定义的数据库 - 使用此连接进行单元测试似乎不正确 - 再次,这种情况会受益于某种类型的模拟?
我意识到像Morphia和Hibernate这样的持久性框架依赖于域对象上的注释来实现它们的魔力.在某种程度上,在我看来,这是在域层中插入持久性问题,这是我们应该努力避免的.
这可能是我应该尝试使用外部配置文件或域模型中的单独DTO来避开的东西吗?或者,持久性和域层之间的这种小漏洞通常被认为是可接受的吗?
我刚刚开始使用MongoDb,我注意到我获得了许多重复记录,我认为这些记录是独一无二的.我想知道如何为我的数据使用复合键,我正在寻找有关如何创建它们的信息.最后,我使用Java来访问mongo和morphia作为我的ORM层,因此在你的答案中包括那些将是非常棒的.
Morphia:http://code.google.com/p/morphia/
我想知道是否有办法在MongoDB的集合中获取数据(即文档)的最后更新/修改时间.更清楚的是,我想进行查询以检索在特定时间之后更新的所有文档.
是否有任何可能的方法来检索MongoDB中最后修改的时间戳?
注意:对于新创建的文档,我知道我们可以从objectId检索时间戳,但是对于更新,id将是相同的.MongoDB是否将每个文档的最后更新时间存储在任何地方?
我使用morphia作为java驱动程序,所以如果有任何可能的方式来自morphia,请告诉我.
我对它们如何相互比较感兴趣,哪些更成熟,哪些功能更多,更适合某些用例.
我自己的用例是创建一个实时监控服务(想想Chartbeat),但是如果你可以谈论其他用例,请做 - 毕竟这个Q&A可能对其他人有用.
我正在使用java/morphia来处理mongodb.从Java层使用默认的ObjectId不是很方便.我想将它作为String类型,同时使用ObjectId保持密钥生成过程_id = new ObjectId.toString().
我想知道这样做是否有任何副作用?例如,它会以任何方式影响数据库性能或导致密钥冲突吗?它会影响分片环境......
我们使用mongo db在生产数据库中存储某些记录.
我们看到我们的记录"_id" : { "$oid" : "50585fbcb046b2709a534502"}在生产数据库中,而我们看到与"_id" : ObjectId(" 50585fbcb046b2709a534502 ")qa数据库中相同的记录.对于我们"ld" : { "$date" : "2011-12-03T17:00:00Z"}在prod数据库中看到的日期,而"ld" :ISODate("2011-12-03T17:00:00Z")在qa数据库中.我们已经在qa环境中成功测试了我们的查询,但担心它可能会在生产中失败
1)我的java查询是否可以在prod&qa上无缝地工作?(我使用morphia apis来查询)2)它们内部是否以相同的方式存储?
关于我刚刚经历过的事情的一个快速问题,我仍在思考为什么:
mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ { "$oid" : "53f1f09f2cdcc8f339e5efa2"} , { "$oid" : "5409ae2e2cdc31c5aa0ce0a5"}]}});
Run Code Online (Sandbox Code Playgroud)
0
mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}});
Run Code Online (Sandbox Code Playgroud)
2
我认为$ oid和ObjectId拼写格式对于MongoDB完全相同.有谁知道为什么第一个查询返回0结果,第二个返回2(正确的答案)?
此外,我正在使用Morphia框架,它使用MongoDB Java驱动程序与MongoDB交互.我已经意识到通过执行以下代码行在ObjectIds数组中使用$ in运算符搜索非_id的字段存在问题:
List< ObjectId > fParams = new ArrayList< ObjectId >();
fParams.add(...);
Query<Ticket> query = genericDAO.createQuery();
query.field("idReferenceList").in(fParams);
result = genericDAO.find(query).asList();
Run Code Online (Sandbox Code Playgroud)
非常感谢你提前.
问候,
有没有办法将枚举保存到mongoDB中?我想保存类似的东西:
public enum SnapshotType {
EVENT,
MEMORY
}
Run Code Online (Sandbox Code Playgroud) 我对mongodb和morphia很新,在开始使用之后,我意识到mongodb文档中有一个额外的部分,该记录包含一个字段名"ClassName",其值为morphia映射的类.
{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"}
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?我觉得它违反了数据库中数据的完整性,无论如何都要绕过它吗?
morphia ×10
mongodb ×9
java ×5
annotations ×1
hibernate ×1
junit ×1
key ×1
mongodb-java ×1
orm ×1
spring ×1
spring-data ×1
unit-testing ×1