0

我正在尝试从以下文档中获取 uniq account_numbers。

{
    "_id" : ObjectId("5825e49785a4caf2bfa64a2f"),
    "profit" : "",
    "account_number" : 10,
    "m_number" : "",
    "registration_number" : "",
    "page_number" : "",
    "entry_date" : ISODate("2016-04-01T07:35:35Z"),
    "narration" : "By cash",
    "voucher_number" : "",
    "debit_credit" : 6150,
    "account_code" : 2102,
    "created_at" : ISODate("2016-04-01T07:35:35Z"),
    "updated_at" : ISODate("2016-04-01T07:35:35Z"),
    "employee_id" : 0,
    "balance" : 0,
    "credit" : 0,
    "debit" : 0,
    "particulars" : "",
    "since_last" : 0,
    "transaction_type" : 0,
    "voucher_path" : "",
    "branch" : "",
    "auto_voucher_number" : "",
    "check_book_series" : ""
}

account_number 类型是数字,我想使用 Spring Mongo 模板将其作为 int 获取。

 Query query = new Query();
    query.addCriteria(Criteria.where("account_code").is(accountCode).and("account_number").exists(true));
    return List accounts = mongoTemplate.getCollection("transaction").distinct("account_number", query.getQueryObject());

上面的代码返回列表帐户。查看调试结果

 accounts = {ArrayList@6192}  size = 2815
 0 = {Double@6217} "1626.0"
 1 = {Double@6218} "1670.0"
 2 = {Double@6219} "2936.0"
 3 = {Double@6220} "2295.0"
 4 = {Double@6221} "1010.0"
 5 = {Double@6222} "1471.0"
 6 = {Double@6223} "3333.0"
 7 = {Double@6224} "1469.0"
 8 = {Double@6225} "3445.0"
 9 = {Double@6226} "3193.0"
 10 = {Double@6227} "219.0"
 11 = {Double@6228} "2509.0"
 12 = {Double@6229} "3750.0"
 13 = {Double@6230} "3425.0"

简短的问题是 - 如何从文档中获取 int 类型列表以及为什么返回双精度类型?

这是文档的 POJO,可能我需要在字段中定义一些东西吗?

@Document(collection = "transaction")
public class Transaction implements Serializable {

    private static final Long serialVersionUID = 1L;

    @Id
    //@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Field(value = "id")
    private String id;

    @Field(value = "account_code")
    private Integer accountCode;

    @Field(value = "account_number")
    private Integer accountNumber;
4

1 回答 1

2

默认情况下,MongoDB 将数值保存为双精度值:

For db.coll.save({x: 1}):x将表示(并由您的 Java 驱动程序转换)为1.0双精度。

要插入 32 位整数,您必须执行以下操作:

db.coll.save({x: NumberInt(1)})

对于 64 个整数,请执行以下操作:

db.coll.save({x: NumberLong(1)})

底层 Java 驱动程序也将通过or保存1为双精度(我认为)。DBObjectDocument

如果您仔细查看您的代码:

mongoTemplate.getCollection("transaction")...

在这里,您将回退到DBCollectionwhich 返回原始列表account_numberwhich is ,如前所述,默认情况下表示为 double 。MongoTemplate映射和转换在这里无关紧要:它们用于整个文档(例如find方法),这里不是这种情况。

为了在int此处使用,您必须自己转换为List值,或将account_number存储值更改为NumberInt.

于 2016-11-17T09:47:40.253 回答