2013-04-29 54 views
0

我試圖學習如何在Mongo中製作類似於查詢的SQL,並發現這個聚合框架,當我運行代碼時,雖然「列」中包含數字,但平均值始終爲「0」如果我明白了吧mongoDB將所有值保存爲一個字符串(在我的sql服務器數據庫中我首先將整數轉換爲mongoDB的數字),所以在使用MongoDB時我真的不必關心類型嗎?有人可以看到爲什麼我的平均功能不工作?訂購數量在1.000000 - 7.000000之間。在MongoDB中聚合的問題

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

您對類型的理解不正確 - 如果將數字存儲爲字符串,則無法將它們作爲數字進行處理,包括對其進行平均處理。確保將數字存儲爲數字(不包括引號!) – 2013-04-29 18:57:00

回答

0

出現這種情況的原因是MongoDB的造成大約類型的值保存的照顧。

如果您想要存儲數字,請確保它們沒有被引用,否則它們將被存儲爲字符串,並且您將失去操作數字的能力。

Javascript還區分數字和字符串,但MongoDB支持的數字類型比簡單的JavaScript更多。您可以閱讀更多here

+0

您可以使用getInt而不是getString()來保存類型。 – 2013-04-30 15:11:02

+0

謝謝Asya!我添加了一些代碼,顯示我如何從源數據庫中獲取數據,我只需要對整數執行getInt並對字符串執行getString,我試圖將if語句和parseInt僅用於getInt(如果值爲整數但我只是不知道!你知道一個簡單的方法來確保所有的數據類型正確地進入mongoDB嗎? – glaring 2013-04-30 17:43:31

+0

我建議你打開一個單獨的Java問題,因爲從mySQL獲取數據與MongoDB無關,所以它不應該在這個問題的討論 – 2013-04-30 18:00:34