Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

282
Views
¿Cómo llenar documentos faltantes con valores 0 en mongoDB?

Tengo una colección en la que almaceno agua dispensada para un día en particular. Ahora, durante algunos días, cuando el dispositivo no funciona, los datos no se almacenan en la base de datos y no obtendré los datos en la colección. Por ejemplo, estoy consultando el agua dispensada durante los últimos 7 días donde el dispositivo solo funcionó durante dos días y me da algo como esto:

 [{ "uID" : "12345678", "midNightTimeStamp" : NumberInt(1645381800), "waterDispensed" : NumberInt(53) }, { "uID" : "12345678", "midNightTimeStamp" : NumberInt(1645641000), "waterDispensed" : NumberInt(30) }]

La conversión de las dos marcas de tiempo anteriores me da datos para el lunes 21 de febrero y el jueves 24 de febrero. Ahora, si ejecuto la consulta del 21 de febrero al 27 de febrero, algo como esto,

 db.getCollection("analytics").find({ uID: "12345678", midNightTimeStamp: {"$in": [1645381800, 1645468200, 1645554600, 1645641000, 1645727400, 1645813800, 1645900200]}})

Esto me devuelve solo dos documentos anteriores, cómo completar los valores faltantes para midNightTimeStamp proporcionados para obtener la lista de documentos como esta que no existe:

 [{ "uID" : "12345678", "midNightTimeStamp" : 1645381800, "waterDispensed" : 53 }, { "uID" : "12345678", "midNightTimeStamp" : 1645468200, "waterDispensed" : 0 }, { "uID" : "12345678", "midNightTimeStamp" : 1645554600, "waterDispensed" : 0 }, { "uID" : "12345678", "midNightTimeStamp" : 1645641000, "waterDispensed" : 30 }, { "uID" : "12345678", "midNightTimeStamp" : 1645727400, "waterDispensed" : 0 }, { "uID" : "12345678", "midNightTimeStamp" : 1645813800, "waterDispensed" : 0 }, { "uID" : "12345678", "midNightTimeStamp" : 1645900200, "waterDispensed" : 0 }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Tal vez algo como esto:

 db.collection.aggregate([ { $group: { _id: null, ar: { $push: "$$ROOT" }, mind: { "$min": "$midNightTimeStamp" }, maxd: { "$max": "$midNightTimeStamp" } } }, { $project: { ar: { $map: { input: { $range: [ "$mind", { "$sum": [ "$maxd", 86400 ] }, 86400 ] }, as: "dateInRange", in: { $let: { vars: { dateIndex: { "$indexOfArray": [ "$ar.midNightTimeStamp", "$$dateInRange" ] } }, in: { $cond: { if: { $ne: [ "$$dateIndex", -1 ] }, then: { $arrayElemAt: [ "$ar", "$$dateIndex" ] }, else: { midNightTimeStamp: "$$dateInRange", "waterDispensed": NumberInt(0) } } } } } } } } }, { $unwind: "$ar" }, { $project: { _id: 0, "waterDispensed": "$ar.waterDispensed", midNightTimeStamp: "$ar.midNightTimeStamp", "Date": { $toDate: { "$multiply": [ "$ar.midNightTimeStamp", 1000 ] } } } } ])

Explicado:

  1. $agrupar los documentos para encontrar el máximo y el mínimo para las marcas de tiempo y $empujar todos los elementos en una matriz temporal llamada "ar"
  2. $proyecte la matriz $mapping con un $rango de fecha generada entre el máximo y el mínimo con un paso de 1x día (86400), llene los elementos vacíos con agua Dispanced:0
  3. $desenrollar la matriz $ar
  4. $proyecte solo los campos que necesitamos en el resultado final.

patio de recreo

over 4 years ago · Santiago Trujillo Report

0

Esto es un poco diferente a la otra respuesta, y se encarga de tomar el "uID" deseado. Los comentarios en el MQL explican el proceso.

 db.collection.aggregate([ { // The uID we want "$match": { "uID": "12345678" } }, { // grab all the uID docs as "water" // keep uID "$group": { "_id": null, "water": { "$push": "$$CURRENT" }, "uID": { "$first": "$uID" } } }, { // create outArray "$set": { "outArray": { // by mapping time vals "$map": { "input": { "$range": [ NumberInt(1645381800), NumberInt(1645900200), 86400 ] }, "in": { "$cond": [ { // already have doc? "$in": [ "$$this", "$water.midNightTimeStamp" ] }, { // yes! Get it! "$arrayElemAt": [ "$water", { "$indexOfArray": [ "$water.midNightTimeStamp", "$$this" ] } ] }, { // no, create it "uID": "$uID", "midNightTimeStamp": "$$this", "waterDispensed": 0 } ] } } } } }, { // only need outArray now "$project": { "_id": 0, "outArray": 1 } }, { // create docs "$unwind": "$outArray" }, { // hoist them "$replaceWith": "$outArray" }, { // don't need _id "$unset": "_id" } ])

Pruébalo en mongoplayground.net .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!