玩这个,无法掌握
如何连接密码.
在MongoDb中它很容易理解但是当我使用morphia时它并不
那么明显,因为文档很少或者我错过了它.
我已经有一个包含5个文档的Collection.
我可以申请那个用户/通行证吗?
如何修改此代码以便日志记录使用用户名和密码?
从这篇文章中获取代码(Thanks @Lennart Koopmann)
MongoDB Java驱动程序教程
public final class MongoConnectionManager {
private static final MongoConnectionManager
INSTANCE = new MongoConnectionManager();
private final Datastore db;
public static final String DB_NAME = "mongo_database";
private MongoConnectionManager() {
try {
Mongo m = new Mongo("localhost", 27017);
db = new Morphia().map(UserData.class)
.map(Statistic.class)
.map(FriendList.class)
.map(ServerData.class)
.map(BatchData.class).createDatastore(m, DB_NAME);
db.ensureIndexes();
}
catch (Exception e) {
throw new RuntimeException("Error initializing mongo db", e);
}
}
public static MongoConnectionManager instance() {
return INSTANCE;
}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Morphia用于一个项目,但是在保存实体时遇到了一些麻烦。我发现实体定义有问题,因此尝试了他们网站上提供的定义,并抛出了此异常。我检查了mongo,一切似乎都很好。正在创建集合,并且似乎有记录。
我开始进行一个简单的JUnit测试,但它不会超越datastore.save(e):
package com.wtf.data;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.emul.org.bson.types.ObjectId;
import com.mongodb.Mongo;
import org.junit.Test;
import java.net.UnknownHostException;
public class MorphiaTest {
@Entity
class MyEntity {
@Id
ObjectId id;
String name;
}
@Test
public void save() {
Mongo mongo = null;
try {
mongo = new Mongo("127.0.0.1", 27017);
} catch (UnknownHostException e) {
e.printStackTrace();
}
Morphia morphia = new Morphia();
morphia.map(MyEntity.class);
Datastore datastore = morphia.createDatastore(mongo, "MorphiaTest");
datastore.ensureIndexes();
MyEntity e = new MyEntity();
datastore.save(e);
}
}
Run Code Online (Sandbox Code Playgroud)
java.lang.RuntimeException:java.lang.ClassCastException:org.bson.types.ObjectId无法在com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:149)处转换为com.mongodb.DBObject …
有没有人知道在创建/修改操作期间,morphia是否支持在mongodb中创建/更新集合中文档的自动时间戳.
我已经知道mongodb中没有这种支持.我想知道是否有任何方法可以获得morphia驱动程序中数据或文档的最后访问/更新时间.
谢谢,悲伤
我的实体包含此字段:
@Embedded
public Map<String, Integer> map;
Run Code Online (Sandbox Code Playgroud)
在我想针对此映射进行过滤的查询中,所有元素都必须具有传入参数的映射的相同键/值。
我按照这里的建议尝试了这个:
for (Entry<String, Integer> e : myMap.entrySet()) {
query.filter("map." + e.getKey(), e.getValue());
}
Run Code Online (Sandbox Code Playgroud)
它正在工作,但我有警告,我不喜欢它:
[warn] o.m.m.q.QueryValidator - The type(s) for the query/update may be inconsistent; using an instance of type 'java.lang.Integer' for the field 'models.MyModel.map' which is declared as 'java.util.Map'
[warn] o.m.m.q.QueryValidator - Validation warnings:
[Validation failed: 'Type java.util.Map may not be queryable with value '2' with class java.lang.Integer']
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找另一种方法来做到这一点。我尝试了所有这些,但没有一个工作:
query.field("map").equal(myMap);
query.filter("map", myMap);
query.field("map").hasAllOf(myMap.entrySet());
query.field("map").hasAllOf(myMap.keySet());
Run Code Online (Sandbox Code Playgroud)
是地图排序问题还是其他问题?有任何想法吗 ?谢谢。
请注意:虽然这个问题提到了Mongo,但它肯定是一个纯粹的Groovy问题.
我的MyApp#bootstrap方法:
def bootstrap(AppConfiguration config) {
String h = config.dbHost
String p = config.dbPort
println "Mongo is at: ${h}:${p}."
dao = new MongoDao(host: h, port: p)
}
Run Code Online (Sandbox Code Playgroud)
我的MongoDao班级(片段):
class MongoDao implements BasicDao {
String dbName
Mongo mongo
String host
String port
Morphia morphia
Datastore datastore
MongoDao(String host, String port) {
this.dbName = "db_myapp"
this.mongo = new Mongo(host, port)
this.morphia = new Morphia()
this.datastore = morphia.createDatastore(mongo, dbName)
morphia.mapPackage("myappdb.common")
}
}
Run Code Online (Sandbox Code Playgroud)
当此bootstrap()方法运行时,我得到以下异常:
Mongo is at: …Run Code Online (Sandbox Code Playgroud) 我有一个使用 MongoLab 作为数据库的 Grails 2.4.4 应用程序。我以前使用 GORM 的 mongo 插件连接到数据库(请参阅此处的插件)。这不是一个好的体验,所以我正在切换到 Morpia 并从 GORM 切换到 mongodb。
我目前有 morphia 库版本 1.0.1 作为项目中的编译时依赖项。我在 Mongolab 中创建了一个用户,用户名:用户名,密码:pass(不是实际的凭证......)
我正在尝试使用 MongoClient 连接到数据库。我一直在查看文档(此处的文档)并且我也参考了这个问题,但它使用的是旧的连接方式。
这是我的错误,即使我没有看到抛出此错误的原因,因为我的字符串格式似乎是正确的:
ERROR context.GrailsContextLoaderListener
- Error initializing the application: Error creating bean with name 'datastore':
Cannot resolve reference to bean 'mongoClient' while setting constructor argument;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'mongoClient': Instantiation of bean failed;
nested exception is org.springframework.beans.BeanInstantiationException:
Could not instantiate bean class [com.mongodb.MongoClient]: Constructor …Run Code Online (Sandbox Code Playgroud) 我有一个相当有趣的问题.尝试从Mongo实例加载模型时,Morphia会抛出以下错误:
[22:17:13 WARN]: Class not found defined in dbObj:
java.lang.ClassNotFoundException: me.mattrick.test.storage.TestStat
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:1.8.0_101]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_101]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[?:1.8.0_101]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_101]
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_101]
at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_101]
at org.mongodb.morphia.mapping.DefaultCreator.getClass(DefaultCreator.java:175) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:97) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.EmbeddedMapper.readMapOrCollectionOrEntity(EmbeddedMapper.java:205) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.EmbeddedMapper.readCollection(EmbeddedMapper.java:142) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:45) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:772) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:230) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:191) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:134) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:146) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:117) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.query.QueryImpl.get(QueryImpl.java:220) [Test-1.5-SNAPSHOT-shaded.jar:?]
at org.mongodb.morphia.dao.BasicDAO.findOne(BasicDAO.java:180) [Test-1.5-SNAPSHOT-shaded.jar:?]
at me.mattrick.test.storage.UserRepository.getUserFromPlayer(UserRepository.java:22) [Test-1.5-SNAPSHOT-shaded.jar:?]
at me.mattrick.test.event.JoinEvent.onJoin(JoinEvent.java:37) [Test-1.5-SNAPSHOT-shaded.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
at …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我使用Morphia来轻松地将 POJO 对象映射到 Mongodb 数据库。但在 2018 年,mongo java 驱动程序开始支持 pojo 自行映射,Morphia 项目被 Mongodb 团队放弃。Morphia 社区版现在已经弃用了DAO,我想知道为什么不直接基于 Mongodb 驱动编写自己的 DAO 类呢?所以我的问题是:
使用Mongodb和Java还需要Morphia吗?Morphia 与直接使用 Mongodb Java 驱动相比有什么好处?
Example code for using the Java driver:
// Getting an object by id:
collection.find(eq("_id", id), Pojo.class).first();
// Insert into collection
collection.insertOne(pojo);
// Update
collection.replaceOne(eq("_id", id), pojo);
// Delete
collection.deleteMany(filter).getDeletedCount();
Run Code Online (Sandbox Code Playgroud) 我正在关注code.google的教程,但我的示例未能提供以下跟踪:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.google.code.morphia.mapping.MappedClass.callLifecycleMethods(MappedClass.java:323)
at com.google.code.morphia.mapping.Mapper.toDBObject(Mapper.java:371)
at com.google.code.morphia.DatastoreImpl.entityToDBObj(DatastoreImpl.java:674)
at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:722)
at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:802)
at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:796)
at models.com.vlist.activity.classes.TestMongoData.testUserData(TestMongoData.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.code.morphia.mapping.MappedClass.callLifecycleMethods(MappedClass.java:304)
... 28 …Run Code Online (Sandbox Code Playgroud) 我正在创建一个简单的VO对象,然后尝试将其持久化到 Mongo 数据库中,NumberFormatException最糟糕的是,对象本身没有抛出异常,因为现在我没有设置对象的任何属性,这个异常正在杀死我,我不确定怎么处理。
这是抛出异常的代码片段:
public void testAgenda(){
ItemVO item = new ItemVO();
try {
item.persist();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
e.getCause();
e.getMessage();
}
Run Code Online (Sandbox Code Playgroud)
这是异常跟踪:
java.lang.RuntimeException:java.lang.NumberFormatException:对于输入字符串:“4e3c3da5fbb7d7b41ce9e394”
在 com.google.code.morphia.mapping.Mapper.updateKeyInfo(Mapper.java:194)
在 com.google.code.morphia.DatastoreImpl.postSaveOperations(DatastoreImpl.java:742)
在 com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:645)
在 com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:685)
在 com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:679)
在 com.williamblair.im.research.domain.vo.BaseDocument.persist(BaseDocument.java:68)
在 com.williamblair.im.research.service.TestListService.testGetResearchAgenda_aroundBody2(TestListService.java:31)
在 com.williamblair.im.research.service.TestListService$AjcClosure3.run(TestListService.java:1)
在 org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
在 com.williamblair.im.research.system.aop.profiling.ProfilingAspect.doProfiling(ProfilingAspect.java:36)
在 com.williamblair.im.research.service.TestListService.testGetResearchAgenda(TestListService.java:26)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在 java.lang.reflect.Method.invoke(Method.java:597)
在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
在 org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
在 org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
在 … 使用morphia POJO映射器在mongodb中实现过滤器时遇到一些问题.
在我的类中(例如SampleClass),当我尝试访问@Entity类的字段时(在我们的例子中Person),我发现字段访问工作正常,使用点符号表示一般字段,如int,string,maps或直接嵌入对象.
问题是我无法理解它如何适用于Person类中引用的"对象列表"的情况.(假设在这里,一个人可以有很多地址,所以这个Person类有一个addresses包含Address对象列表的字段)
@Entity
Class Person
{
String name;
int age;
String type;
private Map<String, String> personalInfo= new HashMap<String, String>();
@Reference
List<Address> addresses = new ArrayList<Address>;
}
@Entity
Class Address
{
String streetName;
int doorNo;
}
Run Code Online (Sandbox Code Playgroud)
例如,我想对List streetName中的Address对象应用过滤器addresses
public class SampleClass
{
private Datastore ds;
Query<Node> query;
CriteriaContainer container;
// connections params etc....
public List<Person> sampleMethod()
{
query = ds.find( Person.class …Run Code Online (Sandbox Code Playgroud) 我用morphia在mongoDB中运行map reduce,这是我的java代码
String map = "function() { emit(this.id,this.cal.charge)}";
String reduce = "function(k, v) {var i, sum = 0;for (i in v) {sum += v[i];}return sum;}";
MapreduceResults<Results> mrRes = ds.mapReduce(MapreduceType.MERGE,ds.createQuery(MyTable.class).field("id").equal(5),map,reduce,null,null,Re.class);
Run Code Online (Sandbox Code Playgroud)
这工作正常并将结果放到'Re'集合中,但是如何在不插入新集合的情况下将结果作为对象或列表获取?
谢谢
我有一个mongo集合,其文档如下所示:
{
"_id" : ObjectId("9873214jkhdkfjdsf8324"),
"nm" : "test",
"sts" : 1,
"updby" : NumberLong(0),
"tags" : [
{
"name" : "women",
"rank" : 1,
"type" : 3
},
{
"name" : "men",
"rank" : 1
},
{
"name" : "clothing",
"rank" : 2,
"type" : 1
}
]
Run Code Online (Sandbox Code Playgroud)
}
我想查询集合,以便我想要所有具有"名称"的文档:"women"和"type":3在返回的每个文档的tags子文档中.
我知道mongo查询应该是这样的:
db.collection.find("tags":{
$all:[
{"$elemMatch":{"name":"women","type":3}},
]})
Run Code Online (Sandbox Code Playgroud)
我尝试使用morphia提供的'hasthiselement',但我无法形成我想要的确切查询.
getMongoDAORead().getDatastore().createQuery(test.class)
.field("tags").hasThisElement("name").equal("women");
Run Code Online (Sandbox Code Playgroud)
此查询似乎不正确.有人可以帮我形成正确的查询吗?