标签: mongotemplate

MongoTemplate Criteria Query

我正在Mongo根据多个参数生成复杂的查询.我想用Criteriahelper类制作的标准之一是:

{"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)

java mongodb spring-data-mongodb mongotemplate

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

MongoTemplate 查询以查找子数组大小大于

我需要编写一个查询,它可以在 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()方法接受一个整数。如何才能做到这一点?

java spring-data mongotemplate

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

如何在更新mongodb中的外部arraylist时在内部arraylist中插入值?

我正在使用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 .. ?? …

java spring mongodb mongorepository mongotemplate

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

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虽然我的查询在控制台上返回结果!

java mongodb spring-mongo mongotemplate spring-mongodb

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

MongoTemplate 聚合 - 按日期分组

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

java spring mongodb mongodb-query mongotemplate

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

MongoDB多租户(Java):如何使用MongoClient在运行时切换具有不同数据库凭据的MongoDB数据库?


我正面临一个关于MongoDB多租户的问题.我有两个不同的mongoDB数据库(db1和db2).这两者都有不同的凭据.

db1凭据:
userName:admin
密码:passwd

db2凭据:
userName:admin1
密码:passwd1

我需要在运行时从一个数据库切换到另一个数据库.我已使用db1凭据自动装配mongoTemplate,但现在我无法使用db2凭据更新模板.这可能吗?如果有,怎么样?如果没有,请告诉我任何其他方式在运行时使用不同的凭据切换数据库.

请注意,我知道"SimpleMongoDbFactory".可以扩展"SimpleMongoDbFactory"并覆盖"getDb"方法并在super.getDb("dbName")中传递所需的dbName以进行多租户.但是,这不适用于具有不同凭据的两个数据库.

java multi-tenant mongodb mongotemplate

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

如何使用 Spring MongoTemplate 将 Java 8 Instant 以日期类型保存到 MongoDB?

我有一个具有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: …

java spring mongodb jsr310 mongotemplate

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

如何在没有模型类的情况下通过 MongoTemplate 获取 MongoDB 对象

我正在尝试获取 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)

java mongodb mongotemplate

5
推荐指数
0
解决办法
2821
查看次数

使用mongoTemplate分页findDistinct

我正在使用自定义查询来选择使用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-data spring-mongo mongotemplate

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

如何在 spring-boot 中使用 MongoTemplate 使用另一个字段更新 MongoDB 集合字段

我需要使用 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)

java mongodb spring-boot mongotemplate

5
推荐指数
0
解决办法
556
查看次数