我正在Mongo
根据多个参数生成复杂的查询.我想用Criteria
helper类制作的标准之一是:
{"field1": {$exists: true, $ne: false}}
Run Code Online (Sandbox Code Playgroud)
我试着用它来做:
Criteria.where("field1").is(Criteria.where("$ne").is(false).and("$exists").is(true))
Run Code Online (Sandbox Code Playgroud)
但它会产生:
{ "field1" : { $java : org.springframework.data.mongodb.core.query.Criteria@23864e60 }
Run Code Online (Sandbox Code Playgroud)
那么,如何实现我需要的确切查询?
我无法对该查询字符串进行硬编码,因为这些类型标准是为field1,... fieldN动态生成的,然后与$or
:
statusCriteria = statusCriteria.orOperator(criterias.toArray(new Criteria[criterias.size()]));
Run Code Online (Sandbox Code Playgroud) 我需要编写一个查询,它可以在 DB 中找到子数组大小大于某物的对象。
我的对象看起来像:
{
"_id" : ObjectId("sbg8732god78"),
"studentIds" : [ "d3782gdo", "d8o3g7" ]
...
}
Run Code Online (Sandbox Code Playgroud)
我需要找到studentIds
数组大小大于n
. 我正在寻找可用的方法,例如:
Query query = new Query();
query.addCriteria(Criteria.where("studentIds").exists(true));
query.addCriteria(Criteria.where("studentIds").size().gt(0));
Run Code Online (Sandbox Code Playgroud)
但是size()
方法接受一个整数。如何才能做到这一点?
我正在使用Spring MongoDB,现在我遇到了将值插入到arraylist中的问题.这是我的POJO类结构......
public class Search implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private String searchkey;
private ArrayList<Lead> leads;
}
Run Code Online (Sandbox Code Playgroud)
"领导"是另一个POJO类,就像......
public class Lead implements Serializable {
private static final long serialVersionUID = 1L;
private String leadtext;
private String address;
private ArrayList<History> trackrecords;
}
Run Code Online (Sandbox Code Playgroud)
"历史"是另一个POJO类,它就像..
public class History implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String changedfield;
private String oldvalue;
private String newvalue;
}
Run Code Online (Sandbox Code Playgroud)
问题是我想在更新一个潜在客户时将数据插入到trackrecords中.有可能在春天mongotemplate .. ?? …
我的以下 mongodb 查询按预期工作
db.importedDataItems.aggregate({
$match: {
mobile: "1234567890"
}
}, {
$group: {
_id: 'mobile',
calls: { $sum: '$calls' }
}
})
Run Code Online (Sandbox Code Playgroud)
但即使在参考这些 问题和教程之后,其等效的 Java 代码...
Aggregation agg = Aggregation.newAggregation(Aggregation.match(Criteria.where("mobile").is("1234567890"),
Aggregation.group("mobile").sum("calls").as("totalCalls"),
Aggregation.project("totalCalls"));
AggregationResults<Doc> results = mongoTemplate.aggregate(agg, "yoCollection",
Doc.class);
Doc doc = results.getMappedResults().get(0);
Run Code Online (Sandbox Code Playgroud)
...返回一个空列表并抛出IndexOutOfBoundsException
虽然我的查询在控制台上返回结果!
我正在尝试使用 mongotemplate 创建聚合查询,其中按日期(即 2016-03-01)而不是日期时间(即 2016-03-01 16:40:12)进行分组。该dateToString
操作存在于 mongodb 文档中,它可用于使用格式从日期时间中提取日期:https :
//docs.mongodb.org/manual/reference/operator/aggregation/dateToString/ 但我得到它与 mongotemplate 一起使用- 我得到一个 NullPointerException。(我的数据库版本是 3.2)
List<AggregationOperation> aggregationOperations = new ArrayList<AggregationOperation>();
aggregationOperations.add(
Aggregation.project("blabla", ...).
andExpression("dateToString('%Y-%m-%d',timeCreated).as("date"));
aggregationOperations.add(Aggregation.group("date").sum("blabla").as("blabla"));
AggregationResults<?> aggregationResults = this.mongoTemplate.aggregate(
Aggregation.newAggregation(aggregationOperations),
collectionName,
resultClass);
Run Code Online (Sandbox Code Playgroud)
当我dayOfMonth(timeCreated)
用来提取一天时,也不例外,但我找不到如何使用dateToString
. 我试过不使用 '' 作为日期格式,它也不起作用......
这是我得到的例外:
java.lang.NullPointerException
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:226)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:324)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:263)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:136)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:36)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.OutMessage.writeQuery(OutMessage.java:211)
at com.mongodb.OutMessage.query(OutMessage.java:86)
at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:81)
at com.mongodb.DB.command(DB.java:320) …
Run Code Online (Sandbox Code Playgroud)
我正面临一个关于MongoDB多租户的问题.我有两个不同的mongoDB数据库(db1和db2).这两者都有不同的凭据.
db1凭据:
userName:admin
密码:passwd
db2凭据:
userName:admin1
密码:passwd1
我需要在运行时从一个数据库切换到另一个数据库.我已使用db1凭据自动装配mongoTemplate,但现在我无法使用db2凭据更新模板.这可能吗?如果有,怎么样?如果没有,请告诉我任何其他方式在运行时使用不同的凭据切换数据库.
请注意,我知道"SimpleMongoDbFactory".可以扩展"SimpleMongoDbFactory"并覆盖"getDb"方法并在super.getDb("dbName")中传递所需的dbName以进行多租户.但是,这不适用于具有不同凭据的两个数据库.
我有一个具有Instant
成员变量类型的 Java 类:
public class SomeRecord {
private String someId;
private Instant someInstant;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 MongoTemplate 更新someInstant
数据库中的字段:
public SomeRecord updateSomeRecordBySomeId(final String someId, Object someInstant) {
Query query = new Query();
query.addCriteria(Criteria.where("someId").is(someId));
Update update = new Update();
update.set("someInstant", someInstant);
return operations.findAndModify(query, update, new FindAndModifyOptions().returnNew(true), SomeRecord.class);
}
Run Code Online (Sandbox Code Playgroud)
如果我将该方法调用为:
updateSomeRecordBySomeId("SOME-ID", Instant.now());
将字段作为Date
类型持久保存在数据库中:
"someInstant" : ISODate("2017-07-11T07:26:44.269Z")
现在该方法也可以被调用为:
updateSomeRecordBySomeId("SOME-ID", "2017-07-11T07:26:44.269Z");
在这种情况下,我得到一个例外:
org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型 [java.lang.String] 转换为类型 [java.time.Instant] 的转换器
这是完全有道理的。(它会更新数据库中的字段String
。"someInstant" : "2017-07-11T07:26:44.269Z"
)
MongoConfig.java: …
我正在尝试获取 Mongo 集合对象。我不想使用模型,因为我的字段在 Mongo 集合中没有固定。
这里 mycustomer_ref
和_id
是固定字段,其他字段不是。可能会添加或删除字段。
如何访问$ref
引用$id
其他集合的字段?
{
"_id" : "SQ74P",
"_class" : "com.vo.License",
"vendor" : "te",
"product" : "ty",
"product_id" : "7.4",
"version" : "17.0",
"is_deleted" : false,
"customer_ref" : {
"$ref" : "customer",
"$id" : "IG_7.4"
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个:
控制器:
@RestController
@EnableAutoConfiguration
@RequestMapping("/license/demo")
public class DemoLiController {
@Autowired
DemoLicRepository demoLicRepository;
@RequestMapping(value = "/lic", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> findLicense() throws Exception {
Map<String, Object> test …
Run Code Online (Sandbox Code Playgroud) 我正在使用自定义查询来选择使用findDistinct
方法的字段。我尝试使用with
方法将pageRequest传递给查询,但仍然得到了完整的结果。有什么办法可以将findDistinct的结果分页吗?
Query query = new Query();
query.addCriteria(Criteria.where("socialAction").in(socialActions));
query.addCriteria(Criteria.where("userId").is(userId));
if (excludedSubjectIds != null) {
query.addCriteria(Criteria.where("subjectId").nin(excludedSubjectIds));
}
PageRequest pageRequest = PageRequest.of(0, 15);
query.with(pageRequest);
List<String> subjectId = mongoTemplate.findDistinct(query, "subjectId", SocialUserHistory.class, String.class);
Run Code Online (Sandbox Code Playgroud)
我期望有15个subjectId,但是目前我正在获取所有的subjectId。
我需要使用 spring-boot 中的 mongo 模板使用另一个字段来更新字段值。我知道如何使用 MongoDB 查询来完成此操作。但无法找到一种MongoTemplate
从数据库级别使用而不将数据加载到内存的方法。
我正在寻找这样的东西。位于value1
集合中,需要根据嵌套数组 ( menu
) 中的值进行更新,并且第 0 个索引始终包含该值。
Query query = new Query();
query.addCriteria(Criteria.where("price").is(0));
Update update = new Update();
update.set("price", "$menu[0].sellingPrice");
mongoTemplate.updateMulti(query, update, CollectionName);
Run Code Online (Sandbox Code Playgroud) mongotemplate ×10
java ×9
mongodb ×8
spring ×3
spring-data ×2
spring-mongo ×2
jsr310 ×1
multi-tenant ×1
spring-boot ×1