मेरे पास निम्न उपयोगकर्ता स्कीमा है:

const User = mongoose.model(
  "User",
  new mongoose.Schema({
    email: String,
    password: String,
    name: String,
    days: [
      {
      day: Date,
      data:  
        { 
          average_score: {type: mongoose.Schema.Types.Decimal128, default: 0 }
        }
      }
    ]
  })
);

दिन के क्षेत्र में मैं उदाहरण के लिए 2020-12-29T00:00:00.000Z जैसे आईएसओ प्रारूप में दिनों को संग्रहीत कर रहा हूं। क्वेरी दिनांक सीमा के बीच के दिनों के डेटा को वापस करने के बजाय सभी डेटा लौटा रही है।

User.find({ "_id": getUserId(req), "days.day":{
        "$gte": new Date("2021-01-02T00:00:00.000Z"), 
        "$lt": new Date("2021-01-04T00:00:00.000Z")
    }},
    function (err, result) {
      if (err){
        res.status(400).send({data: { message: err }});
        return;
      }
      else if(result)
      {
        res.status(200).send({data: { message: result }});
      }
    })

मुझे काम करने के लिए जो समाधान मिला वह है:

let itsArray = Array.isArray(req.body.day)
    let first = itsArray ?  new Date(new Date(req.body.day[0]).toISOString()) : null
    let second = itsArray ? new Date(new Date(req.body.day[1]).toISOString()) : null
    let theDay = itsArray ? null : new Date(req.body.day)
    let now = new Date()
    theDay = itsArray ? null :  new Date(new Date(theDay).toISOString())

    const objectProject = { $project: {
        days: {
          $filter: {
            input: "$days",
            as: "index", 
            cond:{ $eq: [ "$$index.day", theDay ] },
          }
        }
    }}

    const arrayProject = { $project: {
        days: {
          $filter: {
            input: "$days",
            as: "index", 
            cond: {$and: [
              { $gte: [ "$$index.day", first ] },
              { $lte: [ "$$index.day", second ] }
            ]}
          }
        }
    }}

    await User.aggregate([
    {$match:{_id: ObjectID(getUserId(req))}},
    itsArray ? arrayProject : objectProject
  ])
  .project({'days.day':1, 'days.data':1})
  .then(result => {console.log(result})

प्रोजेक्ट, मैच और फिर फ़िल्टर का उपयोग करके वांछित परिणाम प्राप्त होते हैं।

1
Mr. Stefan 17 फरवरी 2021, 22:55

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि मुझे जो परिणाम चाहिए था, उसके लिए कुछ और उन्नत मोंगोडब कुंग-फू की आवश्यकता थी:

const objectProject = { $project: {
        days: {
          $filter: {
            input: "$days",
            as: "index", 
            cond:{ $eq: [ "$$index.day", theDay ] },
          }
        }
    }}

    const arrayProject = { $project: {
        days: {
          $filter: {
            input: "$days",
            as: "index", 
            cond: {$and: [
              { $gte: [ "$$index.day", first ] },
              { $lte: [ "$$index.day", second ] }
            ]}
          }
        }
    }}

    await User.aggregate([
    {$match:{_id: ObjectID(getUserId(req))}},
    itsArray ? arrayProject : objectProject
  ])
  .project({'days.day':1, 'days.data':1})
  .then(result => {console.log(result})
1
Mr. Stefan 26 फरवरी 2021, 13:41