2013-08-20 4 views
0

Я делаю упражнение в mongodb. У меня есть документ со следующей структурой.mongodb, как вставить новое поле?

id city  temperature 
1  cadiz   30 
2  sevilla  40 
3  cadiz   29 
4  sevilla  42 
5  malaga  36 
6  cadiz   30 
7  bilbao  25 
8  sevilla  41 

Как смонтировано в каждом городе максимальное значение температуры одного поля? пример:

max_temperature :true; 

порядок города и температура порядка, но не следует .. спасибо. и извините за мой английский.

+0

Вы хотите, чтобы 'max_temperature' был' истинным' для документов с идентификаторами 1, 6, 8, 5 и 7? Или просто 8? –

+0

max_temperature insert in id 1, 6, 4, 5, 7 (группа для города и максимальная температура) – Bicu

+0

Невозможно сделать это с помощью запроса или повышения в течение одной операции. Если это не то, что вы имеете в виду, вам нужно будет опубликовать код, который вы пробовали. – WiredPrairie

ответ

3

Предполагая, что вы не хотите иметь дубликаты (т.е. с двумя документами {city: "Cadiz", temperature: 30}, только один должен быть отмечен как max_temperature, вы можете выполнить следующее:

var lastCity = null; 
db.cities.find().sort({city: 1, temp: -1}).forEach(
    function(doc) { 
    if (doc.city != lastCity) { 
     db.cities.update({_id:doc._id}, {$set:{"max_temperature":true}}); 
    } 
    lastCity = doc.city; 
    } 
) 

Для данных вы предоставили в вашем вопросе, коллекция будет выглядеть так:

{ "_id" : 7, "city" : "bilbao", "max_temperature" : true, "temp" : 25 } 
{ "_id" : 1, "city" : "cadiz", "max_temperature" : true, "temp" : 30 } 
{ "_id" : 6, "city" : "cadiz", "temp" : 30 } 
{ "_id" : 3, "city" : "cadiz", "temp" : 29 } 
{ "_id" : 5, "city" : "malaga", "max_temperature" : true, "temp" : 36 } 
{ "_id" : 4, "city" : "sevilla", "max_temperature" : true, "temp" : 42 } 
{ "_id" : 8, "city" : "sevilla", "temp" : 41 } 
{ "_id" : 2, "city" : "sevilla", "temp" : 40 } 

Если вы хотите дубликаты, то есть для документа 6, также max_temperature : true, то вы бы изменить тыс е обновление незначительно:

var lastCity = null; 
var lastTemp = null; 
db.cities.find().sort({city: 1, temp: -1}).forEach(
    function(doc) { 
    if (doc.city != lastCity) { 
     lastTemp = doc.temp; 
     db.cities.update({_id:doc._id}, {$set:{"max_temperature":true}}) 
    } else if (doc.temp == lastTemp) { 
     db.cities.update({_id:doc._id}, {$set:{"max_temperature":true}}) 
    } 
    lastCity = doc.city; 
    } 
) 

Который вместо даст вам:

{ "_id" : 7, "city" : "bilbao", "max_temperature" : true, "temp" : 25 } 
{ "_id" : 1, "city" : "cadiz", "max_temperature" : true, "temp" : 30 } 
{ "_id" : 6, "city" : "cadiz", "max_temperature" : true, "temp" : 30 } 
{ "_id" : 3, "city" : "cadiz", "temp" : 29 } 
{ "_id" : 5, "city" : "malaga", "max_temperature" : true, "temp" : 36 } 
{ "_id" : 4, "city" : "sevilla", "max_temperature" : true, "temp" : 42 } 
{ "_id" : 8, "city" : "sevilla", "temp" : 41 } 
{ "_id" : 2, "city" : "sevilla", "temp" : 40 } 

Позвольте мне знать, если это проясняет вещи немного!

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