正如我所看到的,java mongo 驱动程序不提供OutputStream从现有 gridFS 文件获取的功能com.mongodb.gridfs.GridFSFile
我必须GridFSInputFile直接创建或使用gridFs.createFile()方法。
是缺少java驱动还是gridfs的限制?
除了创建新文件/删除旧文件之外,您能否建议任何解决方法?
谢谢
我有一个关于 $currentDate 的问题 ,使用 Java 驱动程序在 mongo db 中插入文档以使其包含“服务器时间”(如某些 RDBMS 中的“now()”)的最佳方法是什么?
例如,以免说我有一个类似的文档:
{
name : "John",
birthday : <$currentDate_goes_here>
}
Run Code Online (Sandbox Code Playgroud)
我想要的是插入文档,以便mongo 服务器在服务器端插入时对日期进行评估。
这很关键,因为我们的服务器可能没有完全同步,并且需要有我们可以依赖的时间(例如 mongo 服务器上的时间)。
我正在使用 mongo 的标准 java 驱动程序,因此 Java 中的任何代码片段都将受到欢迎。
这是我到目前为止所尝试过的
MongoClient mongoClient = new MongoClient();
DB sampleDB = mongoClient.getDB("sampleDB");
BasicDBObject update =
new BasicDBObject("$set", new BasicDBObject("name","john")
.append("$currentDate", new BasicDBObject("birthday",true)));
sampleDB.getCollection("col1").insert(update);
Run Code Online (Sandbox Code Playgroud)
此操作因以下异常而失败:
java.lang.IllegalArgumentException:文档字段名称不能以 '$' 开头(错误键:'$set')位于 com.mongodb.DBCollection.validateKey(DBCollection.java:1845) 位于 com.mongodb.DBCollection._checkKeys( DBCollection.java:1803)在com.mongodb.DBCollection._checkObject(DBCollection.java:1790)在com.mongodb.DBCollectionImpl.applyRulesForInsert(DBCollectionImpl.java:392)在com.mongodb.DBCollectionImpl.insertWithCommandProtocol(DBCollectionImpl.java:381) )在com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:186)在com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:165)在com.mongodb.DBCollection.insert(DBCollection.java:93)在com.mongodb .DBCollection.insert(DBCollection.java:78) 在 com.mongodb.DBCollection.insert(DBCollection.java:120)
我喜欢通过 MongoDB 连接(而不是通过 BSON 转储)将 EMR 集群连接到我们的 MongoDB。
为此,我通过 AWS 管理控制台生成了集群。在 Bootstrap 配置中,我指向了放置在 S3 上的这个文件:
#!/bin/sh
wget -P /home/hadoop/lib http://central.maven.org/maven2/org/mongodb/mongo-java-driver/2.13.0/mongo-java-driver-2.13.0.jar
wget -P /home/hadoop/lib https://github.com/mongodb/mongo-hadoop/releases/download/r1.3.2/mongo-hadoop-core-1.3.2.jar
wget -P /home/hadoop/lib https://github.com/mongodb/mongo-hadoop/releases/download/r1.3.2/mongo-hadoop-pig-1.3.2.jar
wget -P /home/hadoop/lib https://github.com/mongodb/mongo-hadoop/releases/download/r1.3.2/mongo-hadoop-hive-1.3.2.jar
Run Code Online (Sandbox Code Playgroud)
当集群产生时,我进入主节点并看到它们已成功下载。
当我在 Hive shell 中执行此操作时:
CREATE TABLE nicks
(
id STRING,
name STRING,
business STRING,
alias STRING
)
STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
TBLPROPERTIES('mongo.uri'='mongodb://54.93.123.123:27017/foo.aliases');
ADD JAR /home/hadoop/lib/mongo-hadoop-core-1.3.2.jar;
ADD JAR /home/hadoop/lib/mongo-hadoop-hive-1.3.2.jar;
ADD JAR /home/hadoop/lib/mongo-java-driver-2.13.0.jar;
Select * from nicks;
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
Exception in thread "main" java.lang.NoClassDefFoundError: com/mongodb/DBObject
at com.mongodb.hadoop.splitter.MongoSplitterFactory.getSplitterByClass(MongoSplitterFactory.java:41)
at com.mongodb.hadoop.splitter.MongoSplitterFactory.getSplitter(MongoSplitterFactory.java:109)
at com.mongodb.hadoop.hive.input.HiveMongoInputFormat.getSplits(HiveMongoInputFormat.java:64) …Run Code Online (Sandbox Code Playgroud) 我正在使用Mongo-Java-Driver 2.13我在GridFS 中存储了一个 PDF 文件(大小30mb)。我能够轻松地执行插入、删除和查找操作。
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("testDB");
File pdfFile = new File("/home/dev/abc.pdf");
GridFS gfs = new GridFS(db,"books");
GridFSInputFile inputFile = gfs.createFile(pdfFile);
inputFile.setId("101");
inputFile.put("title", "abc");
inputFile.put("author", "xyz");
inputFile.save();
Run Code Online (Sandbox Code Playgroud)
数据在坚持books.files和books.chunks收藏。现在我想更新:
如何在 GridFS 中为案例 1执行这些更新操作?
我开始知道我需要维护我的文件的多个版本并选择正确的版本。有人可以澄清一下吗?
编辑:
我可以轻松更新元数据(标题、作者)。
GridFSDBFile outputFile = gfs.findOne(new BasicDBObject("_id", 101));
BasicDBObject updatedMetadata = new BasicDBObject();
updatedMetadata.put("name", "PG");
updatedMetadata.put("age", 22);
outputFile.setMetaData(newMetadata);
outputFile.save();
Run Code Online (Sandbox Code Playgroud) 我正在使用 Mongo DB java 驱动程序:
collection.bulkWrite(documents);
Run Code Online (Sandbox Code Playgroud)
我有 100 万条记录要插入。如果其中一条记录的插入失败,则在第一次失败时,剩余的记录将不会被插入。为了避免这种情况,我发现有BulkWriteOptionswith orderedas false;
collection.bulkWrite(documents, new BulkWriteOptions().ordered(false) )
Run Code Online (Sandbox Code Playgroud)
如果上述操作过程中出现异常,我们能否获取失败的记录列表bulkwrite,并再次尝试插入这些记录?
我正在尝试更新 mongodb 中的集合,如果字段存在,将插入它。我不太确定如何使用 upsert 选项来做到这一点。
MongoCollection<Document> docs = mongoDb.getCollection("users");
Bson filterQuery = new Document("userId", userId).append("fileType", fileType);
Bson updateQuery = new Document("$set", new Document("fileType", fileType).append("fileName", fileName).append("fileSize", fileSize).append("userId", userId).append("lastModifiedTimestamp", new Timestamp(System.currentTimeMillis())));
updateQuery.append("$setOnInsert", new Document("creationTimestamp", new Timestamp(System.currentTimeMillis())));
docs.updateOne(filterQuery, updateQuery, (new UpdateOptions()).upsert(true));
Run Code Online (Sandbox Code Playgroud)
这是行不通的。我没有更新 $set 和 $setOnInsert 的相同字段,但不确定为什么这不起作用。有什么想法吗?
我在用
并引用此链接accessing-mongodb-with-authentication,并通过以管理员身份登录到 admin 数据库在 myDb 中创建用户。
db.createUser({user: "admin",pwd: "password",roles: [ { role: "readWrite", db: "myDb" } ]});
db.auth('admin','password');
db.grantRolesToUser("admin",[{ role: "dbAdmin", db: "myDb" }])
Run Code Online (Sandbox Code Playgroud)
为了设置 mongodb 身份验证,链接示例有效。spring-data 配置是:
<bean class="org.springframework.data.mongodb.core.MongoTemplate"
id="mongoTemplate">
<constructor-arg name="mongo" ref="mongo" />
<constructor-arg name="databaseName" value="myDb" />
<constructor-arg name="userCredentials" ref="mongoCredentials"/>
</bean>
<bean class="org.springframework.data.mongodb.core.MongoFactoryBean"
id="mongo">
<property name="host" value="localhost" />
<property name="port" value="27017" />
</bean>
<bean id="mongoCredentials" class="org.springframework.data.authentication.UserCredentials">
<constructor-arg name="username" value="admin" />
<constructor-arg name="password" value="password"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
在我的java代码中:
public static void main(String[]s)
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用 Mongo DB java 驱动程序连接到 mongo 实例。下面是我用来创建 MongoClient 实例的代码。
try {
new MongoClient("localhost", 1111);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
如果主机名或端口号不正确,我将得到以下异常。我想知道如何捕获这些异常。MongoDB 连接发生在内部线程中,客户端代码无法捕获。我想知道 MongoClient 是否已正确连接。我怎样才能得到这些信息?
INFO: Exception in monitor thread while connecting to server localhost:0
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63)
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:116)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: Can't assign requested address (connect failed)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50)
at com.mongodb.connection.SocketStream.open(SocketStream.java:58)
... 3 …Run Code Online (Sandbox Code Playgroud) 我使用的是 Java mongodb 驱动程序版本 3.8.0 和 mongodb 3.6.3。
我用这个在一个集合上创建了一个手表:
MongoCursor<ChangeStreamDocument<Document>> cursor = collection.watch().maxAwaitTime(500, TimeUnit.MILLISECONDS).iterator();
Run Code Online (Sandbox Code Playgroud)
此处的文档说明了 maxAwaitTime:
服务器等待新文档以满足更改流查询的最长时间。
但是,我看到的是 cursor.hasNext() 仅在集合发生更改时返回,而不是在传递给 maxAwaitTime 的时间已过时返回。
当我打开 mongodb 的详细日志记录时,我看到 maxWaitTime 在 getMore 命令中按预期设置。
没有更改时,如何使我的手表超时?似乎 maxAwaitTime 应该这样做。为什么不起作用?
我正在使用MongoDB和Spring 3.我有以下域对象:
@Document(collection = "users")
public class User {
@Id
private String id;
private List<Post> posts;
}
Run Code Online (Sandbox Code Playgroud)
我想将添加Post到User,但什么是最好/最有效的方式做到这一点?我可以看到一种以编程方式执行此操作的方法 - 找到用户,将新的帖子对象添加到列表中并再次保存用户 - 但我认为这不是非常优雅或高效.
从文档中我似乎需要使用$push运算符,但我似乎无法找到如何使用Spring的MongoTemplate执行此操作的任何示例.谁能提供一个例子?