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!
Voulez-vous que 'max_temperature' soit 'true' pour les documents avec les identifiants 1, 6, 8, 5 et 7? Ou juste 8? –
max_temperature insérer dans id 1, 6, 4, 5, 7 (groupe pour ville et obtenir la température maximale) – Bicu
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