标签: mongodb-java

$cond运算符java代码

我有一个聚合查询如下:

db.TWITTER_DATA_Processed.aggregate( {$match : { SpId : 840, Scheduler_id : "SCH_01" }},{$group : {_id : {SpId : "$SpId", Scheduler_id : "$Scheduler_id",Country : "$Country"}, positive_count :  { $sum: { $cond: [ { $gt: [ "$Sentiment", 0 ] } , 1, 0 ] } }, neutral_count :  { $sum: { $cond: [ { $eq: [ "$Sentiment", 0 ] } , 1, 0 ] } }, negative_count :  { $sum: { $cond: [ { $lt: [ "$Sentiment", 0 ] } , 1, 0 …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-java aggregation-framework

5
推荐指数
1
解决办法
3808
查看次数

MongoDB 是否为用户提供文档级访问权限?

我有一些集合,我希望用户有权访问基于“标签”字段的文档(行)。因此,user1 在查询集合时只能看到 tag = user1 的文档。

mongodb mongodb-java mongodb-query

5
推荐指数
1
解决办法
4941
查看次数

带有 $in 和 upsert 的 MongoDB UpdateMany

名为 people1 的 Mongo 集合包含以下数据:

db.persons1.find().pretty();


{ "_id" : "Sims",    "count" : 32 }
{ "_id" : "Autumn",  "count" : 35 }
{ "_id" : "Becker",  "count" : 35 }
{ "_id" : "Cecile",  "count" : 40 }
{ "_id" : "Poole",   "count" : 32 }
{ "_id" : "Nanette", "count" : 31 }
Run Code Online (Sandbox Code Playgroud)

现在通过 Java 我编写了代码来增加列表中用户的计数

MongoClient mongoclient = new MongoClient("localhost", 27017);
MongoDatabase db = mongoclient.getDatabase("testdb1");
MongoCollection<Document> collection = db.getCollection("persons1");
List li = new ArrayList();
li.add("Sims");
li.add("Autumn");

collection.updateMany(
    in("_id",li), …
Run Code Online (Sandbox Code Playgroud)

java mongodb mongodb-java mongodb-query

5
推荐指数
1
解决办法
6750
查看次数

MongoDB java 驱动程序 - 大量停放线程

从长远来看,我发现 MongoDB Java 驱动程序 (v3.0.3) 堆积了大量线程。所有这些线程都是服务器监控线程,全部停放等待:

cluster-ClusterId{value='562233d1b26c940820028340', description='null'}-192.168.0.2:27017
    sun.misc.Unsafe.park(Native Method)
    java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
    com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.waitForSignalOrTimeout(DefaultServerMonitor.java:237)
    com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.waitForNext(DefaultServerMonitor.java:218)
    com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:167)
    java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

目前约有 250 人。我认为不需要很多线程来监视与单个数据库主机的连接。我显然做错了什么......,但据我所知,当从驱动程序 v2 移动到 v3 时,我们没有做任何设置更改。可能是驱动程序的错误?有任何想法吗?

mongodb mongodb-java

5
推荐指数
1
解决办法
1651
查看次数

使用身份验证连接到 MongoDB 失败

我在版本 3 中使用 MongoDB,我创建了一个名为“logMonitor”的数据库并创建了一个用户,如:

{
    "_id" : "logMonitor.log",
    "user" : "log",
    "db" : "logMonitor",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "logMonitor"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

当我使用用户“log”通过 shell 连接到数据库时,它返回success,就像这样:

[jboss@chonggouapp mongodb]$ mongo logMonitor -u "log" -p "log"

MongoDB 外壳版本:3.0.6

连接到:logMonitor

但是,使用以下代码通过 Java 连接失败。

    ServerAddress addr = new ServerAddress("10.46.20.65", 27017);
    
    MongoCredential credential = MongoCredential.createMongoCRCredential(
            "log", "logMonitor", "log".toCharArray());
    
    MongoClientOptions options = MongoClientOptions.builder()
            .serverSelectionTimeout(1000)
            .build();
    MongoClient mongoClient = new MongoClient(addr, Arrays.asList(credential), options);
    
    MongoDatabase db = mongoClient.getDatabase("logMonitor");
    
    long c = db.getCollection("sysLog").count(); …
Run Code Online (Sandbox Code Playgroud)

java mongodb mongodb-java

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

在 mongodb 中查找不同于集合

我们以前从集合中查找不同元素的实现曾经是:

List<String> names = mongoClient.getDB(dbName).getCollection(collectionName).distinct(NAME_KEY);
Run Code Online (Sandbox Code Playgroud)

尝试使用 mongo 3.3.0+ 将其升级到当前实现是:

List<String> names = mongoClient.getDatabase(dbName)
                        .getCollection(collectionName, TDocType.class)
                        .distinct(NAME_KEY, String.class); // compile error - required Class<TResult> 
Run Code Online (Sandbox Code Playgroud)

也尝试过

.distinct(NAME_KEY, TDocType.class)  // doesn't work                      
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可迭代对象的目标类型是什么?

编辑- 该问题不是获取不同记录值的重复,因为实现在mongodb-java-driver.

java mongodb mongodb-java mongodb-java-3.3.0

5
推荐指数
1
解决办法
2594
查看次数

org.bson.codecs.configuration.CodecConfigurationException:找不到类 [Ljava.lang.String; 的编解码器;

我想运行以下命令来创建一个使用 MongoDB Java 驱动程序的用户,

    client = new MongoClient(mongoClientURI);
    MongoDatabase database = client.getDatabase("db_1");

    Document createUserCommand = new Document();
    createUserCommand.put("createUser", "abc");
    createUserCommand.put("pwd", "abc");
    createUserCommand.put("roles", new String[]{"userAdmin", "read", "readWrite", "dbAdmin", "dbOwner"});         database.runCommand(createUserCommand);
Run Code Online (Sandbox Code Playgroud)

但发生以下异常:

Exception in thread "main" org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class [Ljava.lang.String;.
    at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
    at org.bson.codecs.configuration.ChildCodecRegistry.get(ChildCodecRegistry.java:51)
    at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:174)
    at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:189)
    at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:131)
    at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
Run Code Online (Sandbox Code Playgroud)

看角色字段是一个数组导致这个问题,可以看看这个问题吗?谢谢

mongodb mongodb-java

5
推荐指数
1
解决办法
9024
查看次数

如何使用java在mongodb中仅获取文档的objectId

我只想从具有匹配条件的 mongodb 中获取 objectId。我可以使用 dbobject 和 cursor 方法获取它。但是我在这里使用了 mongo 客户端,但不知道该怎么做。感谢您

    MongoClient client = new MongoClient("localhost", 27017);
    MongoDatabase database = client.getDatabase("baazaronline");
    MongoCollection<Document> collection = database
            .getCollection("Attribute");

    Bson filter = new Document("attcode", attcode);

    Bson newValue = new Document("DefautV", DefautV).append("IVSO", IVSO).append("UniqueV", UniqueV).append("ValuesR", ValuesR).append("Visiblename", Visiblename).append("citso", citso).append("values",values);
    Bson updateOperationDocument = new Document("$set", newValue);
    collection.updateOne(filter, updateOperationDocument);

    client.close();
Run Code Online (Sandbox Code Playgroud)

java mongodb mongodb-java

5
推荐指数
1
解决办法
5504
查看次数

MongoDB:尝试从 JSON 中读取 Long 会导致 java.lang.Integer 无法转换为 java.lang.Long

我有一个代码可以从 MongoDB 读取特定格式的数据。我需要测试一下。

为此,我使用要测试的数据创建了一个 JSON:

{
  "id": ObjectId("57552e32e4b0839ede67e0af"),
  "serial" : 574000690,
  "startDate" : ISODate("2016-08-22T23:01:56.000Z"),
  "endDate" : ISODate("2016-10-22T22:01:56.000Z"),
  "reason": ""
}
Run Code Online (Sandbox Code Playgroud)

这是应该创建的对象:

public static class MyObject implements Serializable{
    private String id;
    private long serial;
    private Date startDate;
    private Date endDate;
    private String reason;
}
Run Code Online (Sandbox Code Playgroud)

我有一个读取 JSON 文件并创建 Mongo 文档并写入数据库的代码:

List<Document> docs = dirAsDbObjects(dir + File.separator + 
subDir.getName()).collect(Collectors.toList());

docs.forEach(docManipulator);
docs.forEach(doc -> doc.putIfAbsent("_id", new ObjectId()));

ret.addAll(docs);

MongoDatabase db = mongoClient.getDatabase(dbName);
MongoCollection<Document> coll = db.getCollection(subDir.getName());

List<InsertOneModel<Document>> inserts = docs.stream().map(InsertOneModel::new).collect(Collectors.toList());
coll.bulkWrite(inserts);
Run Code Online (Sandbox Code Playgroud)

写入数据后,有一段代码会尝试从 MongoDB 读取数据并将其填充到MyObject …

java json mongodb mongodb-java

5
推荐指数
1
解决办法
2074
查看次数

Spring Data MongoDB 并发更新行为

假设有一个包含单个字段的文档:{availableSpots: 100}

数以百万计的用户竞相通过向 API 服务器发送请求来获得席位。

每次收到请求时,服务器都会读取文档,如果 availableSpot > 0,则会将其减 1 并在另一个集合中创建预订。

现在我读到每当执行更新操作时 mongodb 都会锁定文档。

如果有一百万个并发请求会发生什么?是否会因为同一个文档不断被锁定而需要很长时间?此外,服务器在尝试更新文档之前会读取文档的值,并且当它获取锁时,该位置可能不再可用。

线程也有可能在同一时刻获得“availableSpot > 0”为真,但实际上,availableSpot 可能不足以满足所有请求。这该如何处理呢?

concurrency mongodb mongodb-java

5
推荐指数
2
解决办法
9529
查看次数