2013-04-29 5 views
0

Я пытаюсь научиться делать sql-запросы в Mongo и обнаружил эту структуру агрегации, когда я запускаю код, среднее всегда получается «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, где они хранятся в виде целых чисел, используя код, приведенный ниже. Теперь я вижу, что я использую 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

Причина это происходит в том, что MongoDB делает заботиться о типах значений, Вы экономите.

Если вы хотите хранить номера, убедитесь, что они не указаны в кавычках, иначе они будут сохранены в виде строк, и вы потеряете способность манипулировать ими как цифры.

Javascript также различает числа и строку, но MongoDB поддерживает больше типов номеров, чем простой JavaScript. Вы можете прочитать больше here.

+0

Вы можете использовать getInt вместо getString() для сохранения типа. –

+0

Спасибо Ася! Я добавил код, который показывает, как я получаю данные из исходной базы данных, мне нужно только сделать getInt для целых чисел и getString в строках, я попытался поместить оператор if и parseInt использовать только getInt, если это значение является целым числом но я просто не могу понять это! Вы знаете простой способ убедиться, что все типы данных правильно вошли в mongoDB? – glaring

+0

Предлагаю вам открыть отдельный Java-вопрос, так как получение данных из mySQL не связано с MongoDB, поэтому в обсуждении этого вопроса не должно быть –

Смежные вопросы