我注意到在将文档保存到集合时,MongoDB将多个空间折叠在一起(放入一个空间).它不仅仅是前导和尾随空格,而是任何空间序列 - 只有空格,而不是所有空格(仅用空格和制表符测试).当使用Java驱动程序以及交互式mongo shell时会发生这种情况,所以我猜它是数据存储区本身的"特性".
不可否认,我不喜欢我的价值观中无关的空白,我在剥离它们的过程中发现了这一点.但是,这种行为似乎很奇怪,因为数据存储通常被期望避免"烹饪"或以其他方式更改数据,超出符合底层存储约束的最低限度.否则(未向用户/开发人员声明)可能导致数据丢失或精度降低.此外,为什么要折叠空间而不是在头部和尾部完全修剪它们 - 为什么它们会在非空间角色之间折叠呢?
> db.test.remove()
> db.test.save({x: " x \t\t\t x "})
> db.test.findOne()
{ "x" : " x \t\t\t x " }
Run Code Online (Sandbox Code Playgroud)
我是否错误地启用了此功能,还是默认启用?我在JIRA上找不到任何东西.这对我来说似乎是一个错误,但也许我只是特别的.MongoDB版本2.0.2
我有一个问题,我有收集,我想将文本搜索索引设置为2个字段(描述和标题).但是,当我添加第二个索引时,我得到以下错误,文本搜索停止工作.
{ "serverUsed" : "localhost/127.0.0.1:27017" , "ok" : 0.0 , "errmsg" : "too many text index for: testdb.users"}
Run Code Online (Sandbox Code Playgroud)
当我删除一个索引搜索再次开始工作.问题是什么?一个集合仅支持一个字段的全文搜索索引????
我在windows下使用当前版本的mongodb,我正在使用mongodb java驱动程序API.
谢谢
我在创建连接时使用mongo数据库为我的应用程序连接假脱机配置了下面的mongoOption
MongoOptions options = new MongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost = 40;
options.threadsAllowedToBlockForConnectionMultiplier = 25;
Run Code Online (Sandbox Code Playgroud)
除了我的应用程序,获得以下异常
com.mongodb.MongoInterruptedException: A driver operation has been interrupted
at com.mongodb.DBPortPool.get(DBPortPool.java:216)
at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:440)
at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:177)
at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:155)
at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:349)
at com.mongodb.DBCollection.update(DBCollection.java:177)
at com.mongodb.DBCollection.save(DBCollection.java:817)
at com.mongodb.DBCollection.save(DBCollection.java:785)
at cherrypick.ck.datalayer.mongo.MongoDataAccessLayer.saveObject(MongoDataAccessLayer.java:361)
at cherrypick.ck.emailinterface.CKMailMonitor.processIncomingMessage(CKMailMonitor.java:170)
at cherrypick.ck.emailinterface.CKMailMonitor.monitorNewMessages(CKMailMonitor.java:253)
at cherrypick.ck.emailinterface.CKMailMonitor.run(CKMailMonitor.java:275)
Caused by: java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1325)
at java.util.concurrent.Semaphore.tryAcquire(Semaphore.java:414)
at com.mongodb.util.SimplePool.permitAcquired(SimplePool.java:148)
at com.mongodb.util.SimplePool.get(SimplePool.java:110)
at com.mongodb.DBPortPool.get(DBPortPool.java:214)
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题.
在此先感谢Raja Subramani
我试图用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
我有一个聚合查询如下:
db.TWITTER_DATA_Processed.aggregate( {$match : { SpId : 840, Scheduler_id : "SCH_01" }},{$group : {_id : {SpId : "$SpId", Scheduler_id : "$Scheduler_id",Country : "$Country"}, positive_count : { $sum: { $cond: [ { $gt: [ "$Sentiment", 0 ] } , 1, 0 ] } }, neutral_count : { $sum: { $cond: [ { $eq: [ "$Sentiment", 0 ] } , 1, 0 ] } }, negative_count : { $sum: { $cond: [ { $lt: [ "$Sentiment", 0 ] } , 1, 0 …Run Code Online (Sandbox Code Playgroud) 我有一些集合,我希望用户有权访问基于“标签”字段的文档(行)。因此,user1 在查询集合时只能看到 tag = user1 的文档。
从长远来看,我发现 MongoDB Java 驱动程序 (v3.0.3) 堆积了大量线程。所有这些线程都是服务器监控线程,全部停放等待:
cluster-ClusterId{value='562233d1b26c940820028340', description='null'}-192.168.0.2:27017
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.waitForSignalOrTimeout(DefaultServerMonitor.java:237)
com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.waitForNext(DefaultServerMonitor.java:218)
com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:167)
java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
目前约有 250 人。我认为不需要很多线程来监视与单个数据库主机的连接。我显然做错了什么......,但据我所知,当从驱动程序 v2 移动到 v3 时,我们没有做任何设置更改。可能是驱动程序的错误?有任何想法吗?
假设有一个包含单个字段的文档:{availableSpots: 100}
数以百万计的用户竞相通过向 API 服务器发送请求来获得席位。
每次收到请求时,服务器都会读取文档,如果 availableSpot > 0,则会将其减 1 并在另一个集合中创建预订。
现在我读到每当执行更新操作时 mongodb 都会锁定文档。
如果有一百万个并发请求会发生什么?是否会因为同一个文档不断被锁定而需要很长时间?此外,服务器在尝试更新文档之前会读取文档的值,并且当它获取锁时,该位置可能不再可用。
线程也有可能在同一时刻获得“availableSpot > 0”为真,但实际上,availableSpot 可能不足以满足所有请求。这该如何处理呢?
我刚刚升级了 mongo-db-java-driver,现在方便的功能GridFSBucket.uploadFromStream已经消失了。因此我们现在得到了一个
GridFSUploadPublisher<ObjectId> uploadFromPublisher(String filename, Publisher<ByteBuffer> source);
Run Code Online (Sandbox Code Playgroud)
有什么想法如何将我的 InputStream 转换为 吗Publisher<ByteBuffer>?java驱动程序或Reactor中有任何实用函数吗?
我们有一个 mongo db 副本集配置,其中有 1 个主数据库和 2 个辅助数据库。我们已将读取首选项设置为,primary因为我们的辅助节点之一位于远程区域,并且不希望在该节点上进行读取操作。
如果我在调试模式下逐一运行 collection.find() 方法(该方法使用 MongoCursor 并迭代响应),我会看到所有调用都转到主函数。
上述可以通过2种方式验证:
slowms选项)但是,如果我在没有调试模式(更高的速度+负载)的情况下运行相同的操作,则两台服务器的 mongodb.log 都会开始显示查找操作。这是出乎意料的,因为我们希望调用仅转到主数据库而不是远程辅助数据库。此外,客户端上的 mongo 驱动程序日志显示命令仅发送到主 mongo 服务器。
此外,主 mongodb.log 和辅助 mongodb.log 的区别在于,辅助 mongodb.log 中的 readPreference 显示为“secondaryPreferred”(并且我们不在代码中的任何位置设置此首选项)。
在辅助 mongodb.log 中看到日志的原因可能是什么?
是否只是打印日志并且调用真的会转到主要?或者主服务器确实将调用转发到具有 secondaryPreferred 读取首选项的辅助服务器?
mongodb-java ×10
mongodb ×7
java ×3
bytebuffer ×1
concurrency ×1
mongo-shell ×1
publisher ×1
reactor ×1
spring-data ×1