MongoDB中的聚合问题

时间:2013-04-29 18:43:42

标签: mongodb aggregation-framework

我试图学习如何在Mongo中创建类似sql的查询并找到这个聚合框架,当我运行代码时,平均值总是变为“0”,尽管“列”中有数字,如果我理解正确的话mongoDB将所有值保存为字符串(我在sql server数据库中首先将整数转移到mongoDB中),所以在使用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)

1 个答案:

答案 0 :(得分:0)

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

如果你想存储数字,请确保它们没有被引用,否则它们将被存储为字符串,你将无法将它们作为数字进行操作。

Javascript还区分数字和字符串,但MongoDB支持的数字类型比简单的JavaScript更多。您可以阅读更多here