2013-08-20 12 views
0

Je fais un exercice dans mongodb. J'ai un document avec la structure suivante.mongodb, comment insérer un nouveau champ?

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 

Comme inséré dans chaque ville, une valeur de champ maximale pouvait-elle être atteinte? exemple:

max_temperature :true; 

ville de l'ordre et la température de l'ordre, mais pas suivre .. merci. et désolé pour mon anglais.

+0

Voulez-vous que 'max_temperature' soit 'true' pour les documents avec les identifiants 1, 6, 8, 5 et 7? Ou juste 8? –

+0

max_temperature insérer dans id 1, 6, 4, 5, 7 (groupe pour ville et obtenir la température maximale) – Bicu

+0

Il n'y a aucun moyen de le faire via une requête ou un upsert en une seule opération. Si ce n'est pas ce que vous voulez dire, vous devrez poster le code que vous avez essayé. – WiredPrairie

Répondre

3

En supposant que vous ne pas voulez avoir des doublons (ie avec deux documents de {city: "Cadiz", temperature: 30}, un seul devrait être marqué comme max_temperature, vous pouvez exécuter les éléments suivants:

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; 
    } 
) 

Pour les données que vous avez fournies dans votre question, la collection serait maintenant ressembler à:

{ "_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 } 

Si vous voulez doublons, soit pour le document 6 également avoir max_temperature : true, alors vous modifier e e mise à jour légèrement:

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; 
    } 
) 

Ce qui serait plutôt vous donner:

{ "_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 } 

Laissez-moi savoir si cela clarifie les choses un peu!

Questions connexes