1

我试图学习如何在 Mongo 中进行类似 sql 的查询并找到了这个聚合框架,当我运行代码时,尽管“列”中有数字,但平均值总是为“0”,如果我理解正确的话,mongoDB 会保存所有值作为字符串(我最初转移到 mongoDB 的 sql 服务器数据库中整数的数字)所以在使用 MongoDB 时我不必真正关心类型?有人能明白为什么我的平均功能不起作用吗?订购数量的数量介于 1.000000 - 7.000000 之间。

DBCollection order = db.getCollection("Orderstatus");


DBObject match = new BasicDBObject("$match", new BasicDBObject("Company", "100") );


DBObject fields = new BasicDBObject("Facility", 1);
fields.put("Ordered quantity", 1);
fields.put("_id", 0);
DBObject project = new BasicDBObject("$project", fields );

DBObject groupFields = new BasicDBObject( "_id", "$Facility");
groupFields.put("average", new BasicDBObject( "$avg", "$Ordered quantity"));
DBObject group = new BasicDBObject("$group", groupFields);


AggregationOutput output = order.aggregate( match, project,group );
System.out.println(output);

问题是我认为这些数字将是整数,因为我从我的 sql server 数据库中获取它们,它们使用下面的代码存储为整数。我现在看到我在获取值时使用 getString(),这就是为什么数字是 mongodb 中的字符串的原因吗?我怎样才能将它们作为整数?我真的希望能够将它们作为数字来操纵!

StringBuilder orderstatus = new StringBuilder();
orderstatus.append("SELECT * FROM dbo.fact_orderstatus");
PreparedStatement t = connect.prepareStatement(orderstatus.toString());  
DBCollection orderstat = db.getCollection("Orderstatus");
ResultSet v = t.executeQuery();
ResultSetMetaData rsm = t.getMetaData();
int column = rsm.getColumnCount();

while (v.next()) {
BasicDBObject orderObj = new BasicDBObject();
for(int x=1; x<column +1; x++){
String namn= rsm.getColumnName(x);

String custNum = (v.getString(x));
if (custNum != null && !custNum.trim().isEmpty()
&& custNum.length() != 0)
orderObj.append(namn, custNum);

}


orderstat.insert(orderObj)
4

1 回答 1

1

发生这种情况的原因是 MongoDB确实关心您保存的值的类型。

如果您想存储数字,请确保它们没有被引用,否则它们将被存储为字符串,您将失去将它们作为数字操作的能力。

Javascript 也区分数字和字符串,但 MongoDB 支持的数字类型比简单的 JavaScript 更多。你可以在这里阅读更多。

于 2013-04-29T19:01:15.137 回答