(MongoDB全文搜索)
您好,我已经在索引中添加了一些字段,这就是我搜索search_keyword的方法.
BasicDBObject search = new BasicDBObject("$search", "search_keyword");
BasicDBObject textSearch = new BasicDBObject("$text", search);
DBCursor cursor = users.find(textSearch);
Run Code Online (Sandbox Code Playgroud)
我不希望 在索引中指定的所有字段中搜索search_keyword.*是否有任何方法可以指定要在索引的特定字段中搜索的search_keyword?*
如果是这样,请告诉我如何用Java做到这一点.
谢谢.
MongoIterable.forEach需要一个Block与Java 8非常相似的东西Consumer.它们足够相似会导致问题,例如,以下内容无法编译:
MongoIterable<Document> result = collection.find(...);
result.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
因为编译器无法在Iterable.forEach( Consumer ) 和之间做出决定MongoIterable.forEach( Block ).修复此问题需要明确键入参数的解决方法:
Block<Document> printer = System.out::println;
result.forEach(printer);
Run Code Online (Sandbox Code Playgroud)
或者,MongoIterable作为一个平原处理Stream:
StreamSupport.stream(result.spliterator(), false).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
为什么MongoIterable.forEach没有使用Consumer界面定义,例如:MongoIterable.forEach(Consumer<? super TResult> consumer)?更好 - 为什么要forEach进去MongoIterable呢?
我们有一个简单的应用程序,其中所有用户都在同一时区,因此我们对在 mongo 日期对象中存储时区信息不感兴趣。
这种极端步骤的原因是我们有多个微服务使用由不同开发人员管理的公共数据库。他们每个人都需要在查询中明确设置与时区相关的内容,并在无效数据集中忘记相同的结果。
由于目前 MongoDB 人Mongo 数据类型
不支持存储没有时区的日期。
只是想知道这是他们在 mongo 中表示没有时区的日期的任何替代方法,通过它我们仍然可以利用 mongo 数据库查询基于日期的语法,如日期范围、日期等。
同时,方便DBA 阅读和管理记录。
我正在尝试为以下方法编写 JUnit 测试用例,我正在使用 Mockito 框架。
方法:
public EmplInfo getMetaData(String objectId) {
objectId = new StringBuffer(objectId).reverse().toString();
try{
BasicDBObject whereClauseCondition = getMetaDataWhereClause(objectId);
EmplInfo emplinfo= new EmplInfo ();
emplinfo.set_id(objectId);
FindIterable<Document> cursorPersonDoc = personDocCollection.find(whereClauseCondition);
for (Document doc : cursorPersonDoc) {
emplinfo.setEmplFirstName(doc.getString("firstname"));
emplinfo.setEmplLastName(doc.getString("lastname"));
break;
}
return emplinfo;
}catch(Exception e){
e.printstacktrace();
}
Run Code Online (Sandbox Code Playgroud)
朱尼特:
@Test
public void testGetMetaData() throws Exception {
String docObjectId = "f2da8044b29f2e0a35c0a2b5";
BasicDBObject dbObj = personDocumentRepo.getMetaDataWhereClause(docObjectId);
FindIterable<Document> findIterable = null;
Mockito.when(collection.find(dbObj)).thenReturn(findIterable);
personDocumentRepo.getMetaData(docObjectId);
}
Run Code Online (Sandbox Code Playgroud)
在“personDocumentRepo.getMetaData(docObjectId)”中得到空点期望,因为我“返回”了空的findIterable。不确定如何将虚拟/测试值分配给 findIterable。
请指教。
谢谢!婆罗提
你好,我有这份文件
{
email: "email@gmail.com",
list: [
{
"product": "Car",
"price": 18
},
{
"product": "Boat",
"price": 20
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用参数识别文档,并通过查找具有“Car”参数的产品并使用 MongoDB Java 驱动程序将价格email更新为 15 来更新参数中的特定对象。list
谢谢
我正在使用带有java-driver 2.10.1的MongoDB 2.2
我正在将一个日期字段插入到java.util.Date实例的文档中.我的实例具有以下值:
Wed Oct 10 00:00:00 CEST 2012
但是一旦进入mongo,我就有了这个值:
ISODate("2012-10-09T22:00:00Z")
我的插入代码:
BasicDBObject doc = new BasicDBObject("key", event.getKey())
.append("title", event.getTitle())
.append("description", event.getDescription())
.append("date", event.getDate());
db.getCollection("events").insert(doc);
Run Code Online (Sandbox Code Playgroud)
您可以在此调试屏幕截图中查看从我的事件对象引用的日期实例:

是否与时区有关?或驱动程序的错误?
我在MongoDB集合中有这些项目:
{x: 1, y: 60, z:100}
{x: 1, y: 60, z:100}
{x: 1, y: 60, z:100}
{x: 2, y: 60, z:100}
{x: 2, y: 60, z:100}
{x: 3, y: 60, z:100}
{x: 4, y: 60, z:100}
{x: 4, y: 60, z:100}
{x: 5, y: 60, z:100}
{x: 6, y: 60, z:100}
{x: 6, y: 60, z:100}
{x: 6, y: 60, z:100}
{x: 7, y: 60, z:100}
{x: 7, y: 60, z:100}
Run Code Online (Sandbox Code Playgroud)
我想查询x的不同值(即[1,2,3,4,5,6,7])...但我只想要它们的一部分(类似于我们可以用skip(a)获得的)并限制(b)).
我如何使用MongoDB的java驱动程序(如果可能,使用spring-data-mongodb)?
我在创建连接时使用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
我们以前使用过mongo-java-driver 3.0.4,在某个代码块中有这个实现 -
DBCollection docCollection = mongoClient.getDB(dbName).getCollection(collectionName);
Map<String, Object> docMap = doc.toMap(); // where doc is the CustomDocument
DBObject currentObj = docCollection.findOne(new QueryBuilder().put("id").is(doc.getId()).get());
if(currentObj == null) {
docCollection.insert(new BasicDBObject(docMap));
} else {
docCollection.update(currentObj, new BasicDBObject(docMap));
}
Run Code Online (Sandbox Code Playgroud)
我现在想要实现的是使用mongo-java-driver 3.3.0和更新代码以摆脱不推荐使用的类和方法。我尝试过的与上述代码相对应的是 -
MongoCollection<CustomDocument> docCollections = mongoClient.getDatabase(dbName).getCollection(collectionName, CustomDocument.class);
Bson filter = Filters.eq("id", doc.getId()); // where doc is the CustomDocument
FindIterable<Document> documentList = docCollections.find(filter);
if (documentList == null) {
docCollections.insertOne(doc);
} else {
docCollections.findOneAndUpdate(filter, new BasicDBObject(docMap));
}
Run Code Online (Sandbox Code Playgroud)
我仍然觉得缺少的是findOne在我的代码的收集和基于检查行动,对将要执行的实施insert …
我正在为我的项目使用 MongoDB Java 驱动程序来从 Java 访问我的数据库。
我通常使用Document它,因为它非常易于使用,并且所有方法都在 . 中MongoDBCollection,例如find()使用它并返回Document实例。
然而,在某些情况下,我想使用等效BsonDocument这是更详细的,但提供通过实现类型安全Map<String,BsonValue>,它Document并没有因为它实现Map<String,Object>。
我可以将 a 转换Document为 aBsonDocument:
BsonDocument bsonDoc = document.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());
Run Code Online (Sandbox Code Playgroud)
这里的问题是,在所有的方法MongoDBCollection,比如insertOne()只需要Document实例,所以我不能使用这些。
对我来说,看起来有两种方法可以解决这个问题:
如果BsonDocumentcreated bytoBsonDocument()以某种方式得到了原始 的支持,即使我对 进行了修改Document,我也可以使用原始Document实例BsonDocument,因为原始实例Document会反映这些更改,对吗?它是这样工作的还是BsonDocument只是一个副本?
第二种方法是从BsonDocument回Document转换为. 这在某种程度上可能吗?
提前致谢!