我有一个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.我正在尝试不同的方式,但没有一个是有效的.请帮我.
我在 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) 我正在使用 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
我正在尝试使用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) 我想降低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) 我正在使用 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驱动程序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。
非常感谢。
当我使用 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?
我对 MongoDB 很陌生。尝试了解在 MongoDB 中执行批量写入的最佳选项。我想定期刷新我的应用程序集合。文档的键是 AppID、AppName 和 AppStatus。以下是我想在每次运行中执行的操作 -
Run Code Online (Sandbox Code Playgroud)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 (????);
如何循环 appList 并执行批量插入/更新?
所以我的代码是:
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()在这两个FindIterable和MongoCursor类.谢谢!
UPDATE
似乎唯一的解决方法是再次打电话给mongodb:collection.count正如@Philipp所说
我正在尝试构建一个如下所示的过滤器表达式:
{ $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
我使用 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) 有人能告诉我为什么这个春季交易没有适当回滚吗?
我得到的错误是这样的:
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) mongodb ×12
java ×9
mongo-java ×3
bson ×1
deprecated ×1
jackson ×1
json ×1
jsonparser ×1
mongodb-java ×1
spring ×1
spring-data ×1