标签: mongo-java-driver

如何使用java在mongodb中搜索文档并从中删除字段?

我有一个device集合.

{
   "_id" : "10-100-5675234",
   "_type" : "Device",
   "alias" : "new Alias name", 
   "claimCode" : "FG755DF8N", 
   "hardwareId" : "SERAIL02",
   "isClaimed" : "true",
   "model" : "VMB3010", 
   "userId" : "5514f428c7b93d48007ac6fd" 
 }
Run Code Online (Sandbox Code Playgroud)

我想搜索文档_id,然后在从结果文档中删除字段后更新userId.我正在尝试不同的方式,但没有一个是有效的.请帮我.

java mongodb mongodb-query mongo-java-driver

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

如何使用带数组过滤器的过滤位置运算符应用更新

我在 Mongodb 3.6 上运行,使用 mongo 驱动程序 3.4.3 和 spring 数据 mongo 1.5.10。以下是我的文档结构

{
  "_id": 12345,
  "_class": "com.example.ProductRates",
  "rates": [
    {
      "productId": NumberInt(1234),
      "rate": 100.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201801)
    },
    {
      "productId": NumberInt(1234),
      "rate": 200.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201802)
    },
    {
      "productId": NumberInt(1234),
      "rate": 400.0,
      "rateCardId": NumberInt(2),
      "month": NumberInt(201803)
    },
    {
      "productId": NumberInt(1235),
      "rate": 500.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201801)
    },
    {
      "productId": NumberInt(1235),
      "rate": 234,
      "rateCardId": NumberInt(2),
      "month": NumberInt(201803)
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试对数据进行批量更新,如下所示

db.rates.update(
  { "_id" : 1234 },
  { $set: …
Run Code Online (Sandbox Code Playgroud)

java mongodb spring-data-mongodb mongo-java-driver

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

MongoDB Atlas:不允许用户对 system.indexes 进行操作查找

我正在使用 MongoDB Atlas,最近我开始在我的 MongoDB 副本上收到此错误:

不允许用户对 [mydb.system.indexes] 执行操作 [find]

什么都没有真正改变,所以我想知道可能是什么问题。用户在文档中拥有readWrite角色,看起来它应该有权这样做。另外,我尝试将用户更改为具有任何权限的管理员用户,但仍然出现此错误。有趣的是,集合不存在于但 Spring Data 尝试查询它并收到此错误。mydbsystemmydb

这是来自 mongo 的完整日志:

Error: error: {
    "ok" : 0,
    "errmsg" : "user is not allowed to do action [find] on [mydb.system.indexes]",
    "code" : 8000,
    "codeName" : "AtlasError"
}
Run Code Online (Sandbox Code Playgroud)

MongoDB 连接 URI 如下所示:

spring.data.mongodb.uri=mongodb+srv://[USER]:[PASSWORD]@[MONGO_URL].mongodb.net/mydb
Run Code Online (Sandbox Code Playgroud)

我正在将 Spring Boot2.0.1.RELEASE与版本的 mongo java 驱动程序一起使用3.6.3。Mongo 副本的版本是3.4.14. 知道发生了什么以及如何解决这个问题吗?升级用户角色在这里没有帮助。

mongodb mongo-java spring-data-mongodb mongo-java-driver mongodb-atlas

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

java中的Mongo聚合:具有多个字段的组

我正在尝试使用mongo-java-driver在Java中执行聚合操作.我已经执行了一些其他查找操作,但我无法在Java中正确执行以下聚合:

db.I1.aggregate([
    { "$match": { "ci": 862222} },
    { "$match": { "gi": { "$ne": null } }},
    { "$group": {
        "_id": {
            "ci": "$ci",
            "gi": "$gi",
            "gn": "$gn",
            "si": "$si"
        }
    }},
    { "$group": {
        "_id": {
            "ci": "$_id.ci",
            "gi": "$_id.gi",
            "gn": "$_id.gn"
        },
        "sn": { "$sum": 1 }
    }},
    { "$sort" : { "_id.gi" : 1}}
])
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种方法和方法来在Java中执行聚合,但我无法"ci", "gi", "gn","si"coll.aggregate(asList())方法中正确包含组字段.到目前为止我得到的是以下内容:

MongoCollection<Document> coll = mongo.getCollection("I1");

Document matchCourse = new Document("$match",
    new Document("ci", Integer.parseInt(courseid)));

Document matchGroupNotNull = …
Run Code Online (Sandbox Code Playgroud)

java mongodb mongo-java-driver

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

Spring mongo查询设置自定义超时

我想降低spring-mongo java应用程序中的超时设置(如果数据库不可访问,查询应该在300 ms后失败).

我试过这个配置:

@Configuration
public class MongoConfiguration {

private String mongoUri = "mongodb://127.0.0.1:27017/myDb?connectTimeoutMS=300&socketTimeoutMS=300&waitQueueTimeoutMS=300&wtimeoutMS=300";

@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
    Builder options = new MongoClientOptions.Builder().socketTimeout(300).connectTimeout(300).maxWaitTime(300);
    return new SimpleMongoDbFactory(new MongoClientURI(mongoUri, options));
}

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    MongoDbFactory mongoDbFactory = mongoDbFactory();
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory);
    return mongoTemplate;
}

}
Run Code Online (Sandbox Code Playgroud)

但是mongoUri选项和构建器会更改超时:查询仅在30 000ms后失败.

我不确定我应该覆盖哪个参数,也不确定正确的方法.

谢谢你的帮助

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>1.9.5.RELEASE</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

java spring mongodb spring-data mongo-java-driver

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

Java中使用$elemMatch实现Mongodb查询

我正在使用 Mongo java 驱动程序从 mongo 集合中检索数据。我有以下查询,我试图在 java 中实现:Json 是:

{
    "_id" : ObjectId("56cd284767c74d3d4dd3ec80"),
    "comments" : "Hello",
    "statusLog" : [ 
        {
            "status" : "Submitted",
            "startDate" : ISODate("2015-01-14T05:00:00.000Z"),
            "endDate" : ISODate("2016-02-29T21:24:24.740Z")
        }, 
        {
            "status" : "Active",
            "startDate" : ISODate("2016-02-29T21:24:24.740Z")
        }
    ],
    "createdDate" : ISODate("2015-01-14T05:00:00.000Z")
}
Run Code Online (Sandbox Code Playgroud)

蒙戈查询:

db.CollectionName.find({},{_id: 0, createdDate:1, "statusLog": {$elemMatch: {"status":"Submitted"}}});
Run Code Online (Sandbox Code Playgroud)

这是我用java编写的查询(mongo java driver 3.4.2):

BasicDBObject query = new BasicDBObject(new BasicDBObject("statusLog",
                new BasicDBObject("$elemMatch", new BasicDBObject("status", "Submitted"))));
Run Code Online (Sandbox Code Playgroud)

运行 java 代码会返回所有状态日志,而不是我正在查找的状态日志。

任何帮助将不胜感激。

java mongodb mongodb-query mongo-java-driver

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

使用Java MongoDb驱动程序进行Bson漂亮打印

我正在使用Java MongoDB驱动程序3.3版使用Mongo Aggregation Framework。我有一个聚集管道,这只是类型的集合List<Bson>。我试图找到一种方法来漂亮地打印管道的每个阶段。

toString在每个元素上调用方法是不够的,因为每个阶段都是Bson接口的简单实现的实例,即SimplePipelineStage。这个愚蠢的类没有任何toString方法的覆盖。

使用mongo java驱动程序Aggregates类的工厂方法创建管道,如下所示:

Aggregates.match(/* ... */)
Aggregates.project(/* ... */)
// And so on...
Run Code Online (Sandbox Code Playgroud)

Javadoc可以在这里找到。

我如何漂亮地打印此类对象?我肯定知道类型BasicDbObject具有智能toString实现,但是我找不到找到从转换Bson为的方法BasicDbObject

非常感谢。

java mongodb bson mongo-java mongo-java-driver

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

Mongo Java Driver 3.6.1 - 如何将 json 数组结构化字符串解析为 BasicDBList

当我使用 MongoDB 2.xx 时,我曾经(BasicDBList) JSON.parse("[]")将字符串数据解析为 Document 数组。但是最新的 MongoDB 驱动程序说这已被弃用,BasicDbObject.parse("")唯一的转换为BasicDBObject.

这是我之前在 2.xx Java 驱动程序中使用的一些代码示例

BasicDbList skuList = (BasicDBList) JSON.parse(skus);
Run Code Online (Sandbox Code Playgroud)

所以当我升级到 3.6.1 时,编译器说这已被弃用。并建议使用BasicDbObject.parse()

但这只接受 JSON 对象结构化的字符串......

{ "fruit": "apple"}
Run Code Online (Sandbox Code Playgroud)

...不是 JSON 数组格式的字符串。

所以,如果我有一个像"[\"SKU000001\", \"SKU0000002\", \"SKU0000003\"]"我如何转换为的字符串 BasicDBList

java deprecated mongodb mongo-java-driver jsonparser

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

Java - 使用 MongoDB 集合批量写入插入/更新

我对 MongoDB 很陌生。尝试了解在 MongoDB 中执行批量写入的最佳选项。我想定期刷新我的应用程序集合。文档的键是 AppID、AppName 和 AppStatus。以下是我想在每次运行中执行的操作 -

  1. 在应用程序集合中找到AppID。
  2. 如果不存在则执行插入
  3. 如果存在,则仅更新 AppStatus 键的值。
List<Application> applist = getAppList(); // List contains All the Application

private final MongoClient mongoClient;

private final MongoTemplate mongoTemplate;

MongoCollection<Document> collection =
                  mongoTemplate.getDb().getCollection("Application");
collection.bulkWrite (????);
Run Code Online (Sandbox Code Playgroud)

如何循环 appList 并执行批量插入/更新?

mongodb mongo-java spring-data-mongodb mongo-java-driver

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

MongoCursor没有count()方法?

所以我的代码是:

FindIterable<Document> findIterable = collection.find().skip(20).limit(10);
MongoCursor<Document> cursor = findIterable.iterator();
while (cursor.hasNext()) {
    Document doc = cursor.next();
    // My stuff with documents here
}
cursor.close(); // in finally block
Run Code Online (Sandbox Code Playgroud)

现在我想知道total count之前skip和之前的文件limit.

对于完全相同的问题有一个答案,但我mongo-java-driver v3.1.0和我使用的API是不同的.有没有方法count()size()在这两个FindIterableMongoCursor类.谢谢!

UPDATE

似乎唯一的解决方法是再次打电话给mongodb:collection.count正如@Philipp所说

java mongodb mongodb-java mongo-java-driver

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

MongoDB Java 驱动程序 Filters.expr 产生不正确的过滤器表达式

我正在尝试构建一个如下所示的过滤器表达式:

{ $expr:{ $gt:['$bal1', '$bal2'] } }
Run Code Online (Sandbox Code Playgroud)

使用 Filter.expr 函数:

Bson filter = Filters.expr( gt("$bal1", "$bal2") );
BsonDocument doc = filter.toBsonDocument(BsonDocument.class, collection.getCodecRegistry());
System.out.println(doc.toJson());
Run Code Online (Sandbox Code Playgroud)

这会产生以下 json:

{ "$expr" : { "$bal1" : { "$gt" : "$bal2" } } }
Run Code Online (Sandbox Code Playgroud)

显然这是不对的。有什么方法可以使用 Java 静态导入接口创建此查询,还是我不得不手动构造字符串?我是 Mongo 的新手,我无法想象每个人都在手工构建字符串 - 任何指导将不胜感激。

MongoDB Java 驱动程序 3.6.1

java mongodb mongo-java-driver

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

使用 Java 驱动程序将带有 JsonNode 字段的 POJO 插入 MongoDB

我使用 Mongo Java 驱动程序 3.7

这是我的 POJO(带有 getter 和 setter)-

public class Sample{
    public int field1;
    public JsonNode field2;
}
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码将 Sample 对象插入到 MongoDB 中。

MongoCollection<Sample> myCollection = database.getCollection("myCollection",Sample.class);
ObjectMapper mapper = new ObjectMapper();
    Sample obj = new Sample();
    obj.setField1(1);
    String sampleJSON = "{ \"key\": \"value\" }";
    obj.setField2(mapper.readTree(sample));

myCollection.insertOne(obj);
Run Code Online (Sandbox Code Playgroud)

看到的输出:(JsonNode 字段为空

{
    "_id" : ObjectId("5afbff8a8f621e1e328a8c4e"),
    "field1" : 1
    "field2" : [
                 [ ]
               ],
}
Run Code Online (Sandbox Code Playgroud)

注意:在调试模式下,很明显 JsonNode 是使用正确的数据创建的。但插入行为不当。我想我在这里遗漏了一些东西。任何线索表示赞赏。

更新: 我尝试为 JsonNode 类编写自定义编解码器,但 mongo 从未使用过它。这是我的编解码器代码 -

@Slf4j
public class …
Run Code Online (Sandbox Code Playgroud)

json mongodb jackson mongo-java-driver

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

Spring Data MongoDB @Transactional 失败

有人能告诉我为什么这个春季交易没有适当回滚吗?

我得到的错误是这样的:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available
Run Code Online (Sandbox Code Playgroud)

这是我的存储库,其中包含一个故意失败的保存事务:

@Repository
public class TransactionalRepository {

    private final PlayerRepository playerRepository;

    @Autowired
    public TransactionalRepository(PlayerRepository playerRepository) {
        this.playerRepository = playerRepository;
    }

    public Player saveSuccess(Player player) {
        return playerRepository.save(player);
    }

    @Transactional
    public Player saveFail(Player player) {
        player.setName("FAIL"); // should not be saved in DB if transaction rollback is successful
        player = playerRepository.save(player);
        throw new IllegalStateException("intentionally fail transaction");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongoTransactionApplicationTests {

    @Autowired
    public TransactionalRepository playerRepository;

    @Test
    public void …
Run Code Online (Sandbox Code Playgroud)

spring-transactions spring-data-mongodb mongo-java-driver

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