如何获取数据库中所有集合的列表?
使用Spring-Data,您可以使用@Document批注指定要将对象保存到的集合.假设我有两个班,学生和老师,都坚持进入人物收藏.当我执行以下代码时:
mongo.find(new Query(), Teacher.class);
Run Code Online (Sandbox Code Playgroud)
结果包含学生和教师.查看Spring-Data创建的数据,每个文档都包含一个"_class"字段,用于指示从哪个类持久化.
这个字段在查找过程中没有用作仅返回教师的过滤器?除了这样做之外,我如何仅查询教师:
mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class);
Run Code Online (Sandbox Code Playgroud) 我试图用spring-data-mongodb版本持久保存以下对象1.1.1.RELEASE:
@Document
public static class TestObject {
private final int m_property;
@PersistenceConstructor
public TestObject(int a_property) {
m_property = a_property;
}
public int property() {
return m_property;
}
}
Run Code Online (Sandbox Code Playgroud)
MappingException当我尝试从数据库中读取对象时,我得到了一个(参见下面的完整堆栈跟踪)
我的组使用的命名约定要求参数变量名称a_以及前面的实例变量名称开头m_.似乎spring-data-mongodb假设构造函数参数变量名必须与对象实例变量名匹配.
spring-data-mongodb将构造函数参数用于我在构造函数中定义的实例变量映射? spring-data-mongodb正确构造我的对象,或者是我打破命名约定的唯一选择?.
Exception in thread "main" org.springframework.data.mapping.model.MappingException: No property a_property found on entity class com.recorder.TestRecorder$TestObject to bind constructor parameter to!
at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:90)
at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:70)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:229)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:209)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:173)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:169)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:72) …Run Code Online (Sandbox Code Playgroud) java naming-conventions mongodb-java spring-data spring-data-mongodb
我正在尝试MongoDB的性能来比较我当前基于MySQL的解决方案。
在具有三个属性A,B和C的集合/表X中,我在MongoDB和MySQL中都为属性A编制了索引。
现在,我在MongoDB和MySQL中投入了1M数据,并在这种简单的情况下尝试了搜索性能。
MongoDB上的插入速度仅比插入MySQL快10%。但这没关系,我知道采用MongoDB不会带来我的CRUD的神奇提升,但是我真的对在没有索引的MongoDB中进行搜索感到惊讶。
结果表明,MongoDB在非索引字段上的选择比在索引字段上的选择慢十倍。
另一方面,非索引字段上的MySQL选择(MyISAM)仅比索引字段上的选择慢70%。
最后但并非最不重要的一点是,在选择索引方案中,MongoDB比我的MySQL解决方案快30%。
我想知道,上述数字正常吗?特别是MongoDB的性能选择没有索引?
我的代码如下:
BasicDBObject query = new BasicDBObject("A", value_of_field_A);
DBCursor cursor = currentCollection.find(query);
while(cursor.hasNext()) {
DBObject obj = cursor.next();
// do nothing after that, only for testing purpose
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,从业务逻辑的角度来看,我的收藏可能真的很大(TB甚至更多),您对每个物理收藏的大小有何建议?1000万个文档还是10亿个文档?
非常感谢!
------------------------------编辑------------------- -----------
我在MongoDB和MySQL上都尝试了1000万条记录的插入,而MongoDB的行为比MySQL快20%-确实不如我想的那样。
我很好奇,如果我设置了MongoDB自动分片,是否会提高插入速度?如果是这样,我是否需要将碎片放在不同的物理机器上,或者可以将它们放在具有多核的同一台机器上?
------------------------------更新------------------- -----------
首先,我将MongoDB的写关注从ACKNOWLEDGED修改为UNACKNOWLEDGED,然后MongoDB的插入速度提高了3倍。
后来,我并行制作了插入程序(使用8核计算机的8线程),对于MongoDB ACKNOWLEDGED模式,插入也进行了3倍的改进,对于UNACKNOWLEDGED模式,速度实际上降低了50%。
对于MySQL,并行插入模式将速度提高了5倍!这比MongoDB最好的插入盒快!
Spring Data MongoDB映射默认将BigDecimal转换为String。但是,我希望它们在mongodb中转换为Double。后者对于在mongodb中的此字段上进行查询(比较查询/聚合查询)是必需的。如何注册自己的转换器(BigDecimalToDouble / DoubleToBigDecimal)以执行此操作?
我正在尝试构建MongoDB Java findAndModify查询.
主要目的是我想在自己的插入查询中设置_id.
这是我的代码:
BasicDBObject findFilter = new BasicDBObject("type", "group")
//
BasicDBObject dialogInsertObject = new BasicDBObject("name", "my group").append("_id", new ObjectId());
//
BasicDBObject dialogUpdateObject = new BasicDBObject("name", "my group");
//
BasicDBObject upsertMap = new BasicDBObject();
upsertMap.append("$setOnInsert", dialogInsertObject);
upsertMap.append("$set", dialogUpdateObject);
DBObject dialogObject = dialogCollection.findAndModify(findFilter,
new BasicDBObject("_id", "1"), null, false, upsertMap, true, true);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
com.mongodb.CommandFailureException: { "serverUsed" : "localhost:27017" ,
"errmsg" : "exception: Cannot update 'name' and 'name' at the same time" ,
"code" : 16836 , "ok" : 0.0} …Run Code Online (Sandbox Code Playgroud) 我正在尝试设计一个Mongo Db连接类,我将MongoClient设置为静态.
private static MongoClient client = null;
public static DB connectToMongo() throws Exception {
if (null != client) {
return client.getDB(DBNAME);
}
client = new MongoClient(HOST,PORT);
return client.getDB(DBNAME);
}
Run Code Online (Sandbox Code Playgroud)
我的整个Web应用程序使用上面的方法连接到Mongo,如下所示:
db = MongoDBConnection.connectToMongo();
collection = db.getCollection("collectionName");
Run Code Online (Sandbox Code Playgroud)
执行数据库操作后,我从不为MongoClient调用close连接.连接类总是会返回相同的MongoClient实例,它永远不会关闭.我关闭的唯一内容就是游标.
最近我使用的是新发布的mongodb java异步驱动程序.我正在写一些简单的测试代码,它们是:
MongoClient mongoClient = MongoClients.create();
System.out.println("database has been connected!");
SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Operation Finished!");
}
};
mongoClient.listDatabaseNames().forEach(new Block<String>() {
@Override
public void apply(final String s) {
System.out.println(s);
}
}, callbackWhenFinished);
Run Code Online (Sandbox Code Playgroud)
但是,没有调用回调函数,控制台输出是:
2015年4月18日下午10:50:27 com.mongodb.diagnostics.logging.JULLogger日志消息:使用设置创建的集群{hosts = [localhost:27017],mode = SINGLE,requiredClusterType = UNKNOWN,serverSelectionTimeout ='30000 ms', maxWaitQueueSize = 500}
数据库已连接! 2015年4月18日下午10:50:28 com.mongodb.diagnostics.logging.JULLogger日志消息:ReadPreferenceServerSelector {readPreference = primary}从集群描述ClusterDescription中选择的服务器 {type = UNKNOWN,connectionMode = SINGLE,all = [ServerDescription { address = localhost:27017,type = UNKNOWN,state = …
MongoDB Java驱动程序有三种不同的驱动程序选项:
该司机介绍页面给他们每个人的简要介绍,但没有进一步的解释,提供关于何时应该使用它们.我的问题:请你澄清一下使用它们的案例是什么?什么时候我应该更喜欢一个,当我必须/必须使用特定的驱动程序选项?
我在Spark应用程序和Mongos控制台上运行相同的聚合管道。在控制台上,眨眼间即可获取数据,只需第二次使用“ it”即可检索所有预期数据。但是,根据Spark WebUI,Spark应用程序将花费近两分钟的时间。
如您所见,正在启动242个任务来获取结果。我不确定为什么在MongoDB聚合仅返回40个文档的同时启动如此大量的任务。看起来开销很高。
我在Mongos控制台上运行的查询:
db.data.aggregate([
{
$match:{
signals:{
$elemMatch:{
signal:"SomeSignal",
value:{
$gt:0,
$lte:100
}
}
}
}
},
{
$group:{
_id:"$root_document",
firstTimestamp:{
$min:"$ts"
},
lastTimestamp:{
$max:"$ts"
},
count:{
$sum:1
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
Spark应用程序代码
JavaMongoRDD<Document> rdd = MongoSpark.load(sc);
JavaMongoRDD<Document> aggregatedRdd = rdd.withPipeline(Arrays.asList(
Document.parse(
"{ $match: { signals: { $elemMatch: { signal: \"SomeSignal\", value: { $gt: 0, $lte: 100 } } } } }"),
Document.parse(
"{ $group : { _id : \"$root_document\", firstTimestamp: { $min: \"$ts\"}, lastTimestamp: { $max: \"$ts\"} …Run Code Online (Sandbox Code Playgroud)