标签: mongodb-java

将数据追加到现有 gridfs 文件

正如我所看到的,java mongo 驱动程序不提供OutputStream从现有 gridFS 文件获取的功能com.mongodb.gridfs.GridFSFile

我必须GridFSInputFile直接创建或使用gridFs.createFile()方法。

是缺少java驱动还是gridfs的限制?

除了创建新文件/删除旧文件之外,您能否建议任何解决方法?

谢谢

java mongodb gridfs mongodb-java

4
推荐指数
1
解决办法
4445
查看次数

Mongo 在 Java 驱动程序中插入 $currentDate

我有一个关于 $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)

java mongodb mongodb-java mongodb-query

4
推荐指数
1
解决办法
5688
查看次数

在 AWS EMR 上将 Hadoop+Hive 与 MongoDB 连接(未找到类 com/mongodb/DBObject)

我喜欢通过 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)

hadoop hive amazon-web-services mongodb-java emr

4
推荐指数
1
解决办法
1058
查看次数

如何在 GridFS 中执行更新操作(使用 Java)?

我正在使用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.filesbooks.chunks收藏。现在我想更新

  • 案例1:pdf文件
  • 案例 2:标题或作者

如何在 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)

java mongodb gridfs mongodb-java

4
推荐指数
1
解决办法
7584
查看次数

在 MongoDB java 中批量写入时处理异常 ordered as false

我正在使用 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 mongodb-java mongodb-query

4
推荐指数
1
解决办法
9740
查看次数

在 upsert 期间使用 $set 和 $setOnInsert

我正在尝试更新 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 的相同字段,但不确定为什么这不起作用。有什么想法吗?

mongodb mongodb-java mongodb-query

4
推荐指数
1
解决办法
6338
查看次数

spring-data-mongodb 给出 mongodb 身份验证异常

我在用

  • MongoDB 3.2.0
  • Mongo-Java-Driver 3.2.0
  • spring-data-mongodb 1.9.2

并引用此链接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)

mongodb mongodb-java spring-data-mongodb

4
推荐指数
1
解决办法
1万
查看次数

创建 MongoClient 实例时如何捕获异常

我正在使用 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)

mongodb mongodb-java

4
推荐指数
1
解决办法
1万
查看次数

使用 mongodb java 驱动程序,maxAwaitTime 无法处理更改流

我使用的是 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 mongodb-java

4
推荐指数
1
解决办法
1034
查看次数

MongoDB $ push操作符是否可以添加嵌入式文档?

我正在使用MongoDB和Spring 3.我有以下域对象:

@Document(collection = "users")
public class User {

    @Id
    private String id;

    private List<Post> posts;
}
Run Code Online (Sandbox Code Playgroud)

我想将添加PostUser,但什么是最好/最有效的方式做到这一点?我可以看到一种以编程方式执行此操作的方法 - 找到用户,将新的帖子对象添加到列表中并再次保存用户 - 但我认为这不是非常优雅或高效.

从文档中我似乎需要使用$push运算符,但我似乎无法找到如何使用Spring的MongoTemplate执行此操作的任何示例.谁能提供一个例子?

mongodb spring-3 mongodb-java

3
推荐指数
1
解决办法
2268
查看次数