我有一个更新的对象/文档列表,我需要立即保存列表中的所有对象。
我在 MongoTemplate 中看到 save() 但它一次只能保存一个文档。有什么方法可以一次保存多个文档,或者我需要调用循环保存?
mongodb mongo-java spring-data-mongodb mongotemplate mongo-java-driver
我正在编写一个算法,它将通过java中所有可用的Mongo数据库.
在Windows shell上我就是这么做的
show dbs
Run Code Online (Sandbox Code Playgroud)
我怎样才能在java中执行此操作并获取所有可用数据库的列表?
Mongo和Java大师.我们的团队决定使用最近在MongoDB中引入的全文搜索API.但是,我们发现使用Java MongoDB驱动程序执行命令有些困难.
这是我正在使用的代码:
public BasicDBObject find(String search) {
BasicDBObject searchCommand = new BasicDBObject();
searchCommand.put("text", new BasicDBObject().append("search", search));
CommandResult commandResult = db.command(searchCommand);
}
Run Code Online (Sandbox Code Playgroud)
这是我打印时得到的
System.out.println(commandResult)
{ "serverUsed" : "/127.0.0.1:27017" , "errmsg" : "exception: wrong type for field (text) 3 != 2" , "code" : 13111 , "ok" : 0.0 }
Run Code Online (Sandbox Code Playgroud) 我有下面的代码有效:
if (aDBCursor.hasNext()) {
DBObject aDbObject = aDBCursor.next();
aDbObject.put("title", "Test Title");
ArrayList<DBObject> department = new ArrayList<DBObject>();
DBObject nested1 = new BasicDBObject();
nested1.put("name", "Department A");
nested1.put("id", 1);
department.add(nested1);
DBObject nested2 = new BasicDBObject();
nested2.put("name", "Department B");
nested2.put("id", 2);
department.add(nested2);
aDbObject.put("department", department);
collection.save(aDbObject);
}
Run Code Online (Sandbox Code Playgroud)
但是我在地图中有A部和B部的数据,如:
Map<Object,Object> map = new HashMap<Object,Object>();
map.put("1", "Department A");
map.put("2", "Department B");
Run Code Online (Sandbox Code Playgroud)
保存这些数据的最佳/最简单方法是什么?有没有办法将地图直接放入mongo DB?或者我是否必须在地图上循环?
进入地图的数据已经从数据库中获取,如下所示:
String[] values = req.getParameterValues("departments");
Map<Object,Object> map = new HashMap<Object,Object>();
DBCollection collection = database.getCollection("Departments");
BasicDBObject query = new BasicDBObject();
query.put("id", new BasicDBObject("$in", values));
DBCursor …Run Code Online (Sandbox Code Playgroud) 我正在使用带有java和MongoDB的mongo-jackson-wrapper.我通过查询我的一个字段(而不是_id字段)找到一个对象,然后我需要知道_id字段值,无论结果是更新还是插入.但是,我得到一个例外:
com.mongodb.MongoException: No objects to return
at net.vz.mongodb.jackson.WriteResult.getSavedId(WriteResult.java:97)
Run Code Online (Sandbox Code Playgroud)
异常来自包装器,而不是MongoDB驱动程序本身.
WriteResult<EntityDocument, String> wr
= coll.update(DBQuery.is("corefEntityId", corefEntityId), up, true, false);
Run Code Online (Sandbox Code Playgroud)
什么(如果有的话)是正确的方法吗?
当定义要返回的字段时(collection.find(q, fields)),mongoDB是否(如何)支持比较字段名称(而不是值)?
例如,根据字段名称选择一系列字段,而不考虑其值。
假设文档中有以下字段(无论值是什么):
fieldA000 fieldA001 fieldA002 fieldB000 fieldB001 fieldC000 ...
Run Code Online (Sandbox Code Playgroud)
我想限制任何字段名称匹配的返回字段fieldA000 to fieldA999(无需明确定义任何字段名称)或fieldA.*(reg ex)或类似的。
PS:我目前正在评估是否可以使用 mongoDB 而不是 Cassandra,其中列范围/切片选择以非常易于使用的方式提供。
我正在尝试使用操作数AND'd一起查询集合.我有shell版本工作:
db.widgets.find({color: 'black, shape: 'round', weight: 100})
Run Code Online (Sandbox Code Playgroud)
我无法找到Java等价物(使用本机驱动程序).我尝试了各种各样的东西,但这是我最近的尝试:
// Find all black, round widgets with weight 100
List<BasicDBObject> criteria = new ArrayList<BasicDBObject>();
criteria.add(new BasicDBObject("color", "black"));
criteria.add(new BasicDBObject("shape", "round"));
criteria.add(new BasicDBObject("weight", 100));
DBCursor cur = widgets.find(new BasicDBObject("$and", criteria));
// Get all matching widgets and put them into a list
List<Widget> widgetList = new ArrayList<Widget>();
DBCursor cur = widgets.find(andQuery);
while (cur.hasNext()) {
widgetList.add(new Widget(cur.next()));
}
if (widgetList.isEmpty())
System.out.println("No results found");
Run Code Online (Sandbox Code Playgroud)
有什么想法有什么不对?
我正在为我的Web应用程序使用spring-data-mongodb(1.7.0.RELEASE)和spring-webmvc框架.我正在使用mongoRepository使用基本的CRUD函数,但我没有在我的代码中关闭mongo连接因为我认为spring-data-mongodb将自己关闭它,但它继续打开新连接而不是关闭它们.这些太多的连接都会导致我的应用程序崩溃,我必须一次又一次地重启tomcat(每天两次)才能解决这个问题.
注意:Spring Application和mongod在同一台服务器上.这是崩溃后的日志 -
2015-07-17T01:31:20.068-0400 I NETWORK [conn3645] end connection 127.0.0.1:55302 (2583 connections now open)
2015-07-17T01:31:20.071-0400 I NETWORK [conn1713] end connection 127.0.0.1:48174 (2352 connections now open)
2015-07-17T01:31:20.072-0400 I NETWORK [conn2250] end connection 127.0.0.1:51017 (2325 connections now open)
2015-07-17T01:31:20.072-0400 I NETWORK [conn2149] end connection 127.0.0.1:50670 (2320 connections now open)
Run Code Online (Sandbox Code Playgroud)
这是重启tomcat后的日志
2015-07-17T01:31:29.994-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:53599 #3984 (1 connection now open)
2015-07-17T01:31:33.263-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:53740 #3985 (2 connections now open)
2015-07-17T01:31:33.580-0400 I NETWORK [initandlisten] connection …Run Code Online (Sandbox Code Playgroud) 我在mongodb Java教程中找到了有关如何从mongo集合中查询的信息,但是eq它们对我来说不起作用!您知道如何使用mongo和java过滤集合中的文档吗?
这是我的尝试:
package Database;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class StackOverflow {
public static void main(String[] args) {
// insert something to mongo:
final String URI = "mongodb://localhost:27017";
final String DB = "StackOverflowQuestion";
final String COLLECTION = "eqDoesntExcist";
MongoClientURI connection = new MongoClientURI(URI);
MongoClient mongo = new MongoClient(connection);
MongoDatabase database = mongo.getDatabase(DB);
MongoCollection<Document> collection = database.getCollection(COLLECTION);
Document doc = new Document("name", "Troy").append("height", 185);
collection.insertOne(doc);
doc = new …Run Code Online (Sandbox Code Playgroud) 我正在使用聚合管道运行查找查询。在迭代从聚合执行返回的光标时,我注意到当 Mongo 发送 getMore 命令时程序挂起。我相信这个命令用于从数据库中获取下一批记录。
最初我使用 100 的批量大小进行测试,它相当快地获取 100 条记录,但是当它尝试获取下一组记录时,游标会挂起。我尝试了同样的方法,批量大小为 2,得到了相同的结果。
我正在使用 Mongo Java 驱动程序版本 3.6 和服务器 3.6.2。我还发现过去 python 驱动程序也出现过类似的问题(https://jira.mongodb.org/browse/PYTHON-276)。
过去有人经历过这种情况吗?任何的意见都将会有帮助。如果需要任何其他详细信息,请告诉我