在阅读mongo站点上有关使用Java驱动程序的所有文档时,它引用了使用MongoClient()建立连接.它讨论了他们以前如何使用Mongo()但它已被弃用.但是,当我下载Mongo数据库链接到的最新(或任何)版本的java驱动程序(http://central.maven.org/maven2/org/mongodb/mongo-java-driver/)时,加载它进入我的项目库,我无法导入com.mongodb.MongoClient,因为它不存在!我已经尝试了他们链接到的驱动程序的六个不同版本.我实际上可以使用已弃用的Mongo()来使我的程序正常工作,但我不想在不推荐使用的功能上构建新软件.我在这里也找不到其他同样问题的人
以上是2.93版.任何人都可以帮我找到我做错了什么或错过了吗?我认为它是驱动程序版本,但这些是Mongo网站上的链接.我也不认为它的使用错误,因为我可以让其他一切工作得很好.
我正在使用MongoDB 3.0.假设有一组文件命名photos,其结构是
{"_id" : 1, photographer: "jack"}
Run Code Online (Sandbox Code Playgroud)
使用database.getCollection("photos"),Mongodb将返回一个MongoCollection对象,我有方法count()获取返回的数字文件.
但是,当我使用特定条件进行查询时.例如,查找ID小于100的文档:
photosCollections.find(Document.parse("{_id : {$lt : 100}}"))
Run Code Online (Sandbox Code Playgroud)
上面的find方法将始终返回一个不提供count()功能的游标.那么我怎么知道返回了多少文件呢?我知道在命令行上,我可以使用
db.photos.find({_id : {$lt : 100}}).count()
Run Code Online (Sandbox Code Playgroud)
当然,我可以通过迭代器并自己计算文档数量.但是我发现它真的很笨拙.我想知道MongoDB java驱动程序是否提供了这样的功能来计算find()方法返回的文件数量?如果没有,决定背后的原因是什么?
我试图用spring查询mongodb.我们有一个集合,它包含一个树,并包含一个项目列表作为树路径(因此我们可以轻松遍历树).我们有一个查询需要返回特定节点的所有子节点.我们的查询基于选择路径中具有节点(父节点)并且比父节点(级别)低一级的所有节点.我们的标准如下:
Criteria.where("treePath").in(parentId).and("treePath").size(level)
Run Code Online (Sandbox Code Playgroud)
唉,当我们在mongodb上调用它时,我们得到以下异常:
org.springframework.data.mongodb.InvalidMongoDbApiUsageException:由于com.mongodb.BasicDBObject的限制,您无法添加第二个'treePath'表达式,指定为'treePath:{"$ size":2}'.Criteria已经包含'treePath:{"$ in":["50137df5f49f9b4a6481d639"]}'.
是否有其他建议如何实现相同?我想到的一个选择是直接查询mongodb.我试过了
String command = "{findAndModify:\"Task\",query:{$and:[{treePath:\"5013a79a36600872ecf4dba8\"},{treePath:{$size:2}},{order:{$gte:0}}]},update:{$inc:{order:1}}}";
CommandResult commandResult = mongoTemplate.executeCommand(command);
Run Code Online (Sandbox Code Playgroud)
但这只会更新第一条记录,我需要更新它们.
谢谢!
我正在使用BulkWriteOperation(java驱动程序)以大块存储数据.起初它看起来工作正常,但是当集合的大小增加时,插入可能需要花费很多时间.
目前,对于20M文档的集合,1000个文档的批量插入可能需要大约10秒.
有没有办法使插入独立于集合大小?我没有任何更新或upsert,它总是我插入的新数据.
从日志来看,锁似乎没有任何问题.每个文档都有一个索引的时间字段,但是它呈线性增长,因此我认为没有必要让mongo花时间重新组织索引.
我很想听听一些提高性能的想法
谢谢
我将一个带有java.util.Date字段的对象保存到MongoDB 3.2实例中.
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject);
collection.insertOne(Document.parse(json));
Run Code Online (Sandbox Code Playgroud)
字符串包含:
"captured": 1454549266735
Run Code Online (Sandbox Code Playgroud)
然后我从MongoDB实例中读取它:
final Document document = collection.find(eq("key", value)).first();
final String json = document.toJson();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xx = mapper.readValue(json, MyClass.class);
Run Code Online (Sandbox Code Playgroud)
反序列化失败:
java.lang.RuntimeException:com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.util.Date的实例
我看到"document.toJson()"创建的json字符串包含:
"captured": {
"$numberLong": "1454550216318"
}
Run Code Online (Sandbox Code Playgroud)
而不是最初的("捕获":1454549266735)MongoDB文档说他们开始使用"MongoDB Extended Json".我试过杰克逊1和2解析它 - 没有运气.
将MongoDB 3提供的Document对象转换为Java POJO的最简单方法是什么?也许我可以完全跳过Json()步骤?
我试过mongojack - 那个不支持MongoDB3.
看看MongoDB文档页面上列出的其他几个POJO映射器 - 它们都需要将自定义注释放到Java类中.
我必须使用java编写一个复杂的mongo查询,但我无法做到.
mongo查询如下所示:
db.video.findOne( {
$or: [
{ key1: { $in : [764] } },
{ key2: {$in : [list2] } },
{ $and [ { key2 : 3}, {key4:67} ] }
]
})
Run Code Online (Sandbox Code Playgroud)
我必须使用QueryBuilder类编写上述查询.我该怎么办?
谢谢
我正在开发一个可能拥有大量用户的Android移动应用程序(假设大约有100万).这些用户可以关注其他用户(如Twitter).该应用程序通过远程REST后端同步用户数据.用户数据本身保存在面向文档的数据库中(在我的例子中,它是MongoDB).
目前我问自己设计用户模型的最佳方式,包括其关注者和以下关系.首先想到的是将关系嵌入用户文档中.
示例用户文档:
{
"_id":"50fd6bb530043e3c569af288",
"name":"Marsha Garcia",
"follower"["50fd6bb530043e3c569af287","50fd6bb530043e3c569af289","50fd6bb530043e3c569af28c"],
"following":["70fd6bb530043e3c569af289","10fd6bb530043e3c569af222","89fd6bb530043e3c569af45o"]
}
Run Code Online (Sandbox Code Playgroud)
积极的是,后续/后续关系已经与用户联系在一起.但是,假设用户跟随大约100.000或更多其他用户.然后文档大小将变得非常大.如果我在移动应用程序中通过REST服务加载此用户对象,可能需要一段时间.此外,在最坏的情况下,用户文档可能超过MongoDb 16MB文档限制.
因此,我的第二个想法是以更经典的方式对关注者和关系进行建模:包含每个用户的以下关系的额外文档.
示例'用户关系'文档:
{
"_id": 50fe65828de290c0a8a8ea2d"
"uid": "50fd6bb530043e3c569af288",
"rel_uid": "50fe65828de290c0a8a8e9a6",
"type": "FOLLOWING"
}
Run Code Online (Sandbox Code Playgroud)
积极的是每个用户文档的大小将保持不变.缺点是,有很多用户和以下关系,我可以很容易地在我的MongoDB'用户关系'集合中获得数百万条目.当然我要在字段上设置一个索引但是我不太确定这个解决方案是否能够很好地扩展应用程序用户请求他/她当前关注者的用例.
我很感激有关我的建模问题的任何想法,经验.也许任何人都有更好的解决方案.
提前做了很多.
关于我刚刚经历过的事情的一个快速问题,我仍在思考为什么:
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的新手.
我需要插入一个没有自动生成_id字段的doc.
我需要将字段Tenant_id设置为唯一,或者需要将"_id"字段更改为Tenant_id.
怎么做?
这样的事情
Tenant
{Tenant_id: 123, Tenant_info: ...}
Run Code Online (Sandbox Code Playgroud) 我想能够检测一下mongo服务器是否可以从java驱动程序中获取,以便对任何异常事件作出反应,就像在JDBC登陆中那样.当服务器启动时,一切正常,但我很难理解为什么检测错误非常困难.我有一种感觉,因为mongo客户端运行在一个不同的线程,它不会扔给我或什么?
try {
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase db = mongoClient.getDatabase("mydb");
// if db is down or error getting people collection handle it in catch block
MongoCollection<Document> people = commentarr.getCollection("people");
} catch (Exception e) {
// handle server down or failed query here.
}
Run Code Online (Sandbox Code Playgroud)
结果是
INFO: Exception in monitor thread while connecting to server localhost:27017
Run Code Online (Sandbox Code Playgroud)
由此产生的堆栈跟踪包含一些我试图捕获的不同异常但我的catch块仍然没有做任何事情.
com.mongodb.MongoSocketOpenException: Exception opening socket
Caused by: java.net.ConnectException: Connection refused
Run Code Online (Sandbox Code Playgroud)
我使用的是java mongodb驱动程序3.0.4,我读过的大多数帖子都来自较旧的API,其中的hack MongoClient.getDatabaseNames()会抛出MongoExceptionif if errors,除了现在已经弃用并替换为MongoClient.listDatabaseNames()没有相同的错误抛出语义.
有没有办法在try catch块中从java驱动程序执行mongo查询并实际捕获异常?