मुझे $cond कथन में नेस्टेड सरणी आइटम को संदर्भित करने में समस्या आ रही है।

db.getCollection('bookings').aggregate([
  {
    $lookup: {
      from: "listings",
      localField: "listingId",
      foreignField: "_id",
      as: "listing"
    }
  },
  {
    $match: {
      $and: [
        {
          locationId: ObjectId("5c0f0c882fcf07fb08890c27")
        },
        {
          $or: [
            {
              $and: [
                {
                  state: "booked"
                },
                {
                  startDate: {
                    $lte: new Date()
                  }
                },
                {
                  startDate: {
                    $gte: ISODate("2019-12-18T07:00:00.000Z")
                  }
                }
              ]
            },
            {
              $and: [
                {
                    listing: {
                        $elemMatch: { 
                            inspectionStatus: "none" 
                         }
                    }
                },
                {
                  endDate: {
                    $lte: new Date()
                  }
                },
                {
                  endDate: {
                    $gte: ISODate("2019-12-18T07:00:00.000Z")
                  }
                },
                {
                  state: {
                    $in: [
                      "active",
                      "returned"
                    ]
                  }
                }
              ]
            },
            {
              $and: [
                {
                  state: {
                    $ne: "cancelled"
                  }
                },
                {
                  $or: [
                    {
                      $and: [
                        {
                          startDate: {
                            $gte: ISODate("2019-12-20T07:00:00.993Z")
                          }
                        },
                        {
                          startDate: {
                            $lte: ISODate("2019-12-21T06:59:59.999Z")
                          }
                        }
                      ]
                    },
                    {
                      $and: [
                        {
                          endDate: {
                            $gte: ISODate("2019-12-20T07:00:00.993Z")
                          }
                        },
                        {
                          endDate: {
                            $lte: ISODate("2019-12-21T06:59:59.999Z")
                          }
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  },
  {
    $addFields: {
      isLate: {
        $cond: [
          {
            $or: [
              {
                $and: [
                  {
                    $eq: [
                        "$listing.0.inspectionStatus",
                      "none"
                    ]
                  },
                  {
                    $lte: [
                      "$endDate",
                      new Date()
                    ]
                  },
                  {
                    $gte: [
                      "$endDate",
                      ISODate("2019-12-18T07:00:00.000Z")
                    ]
                  },
                  {
                    $in: [
                      "$state",
                      [
                        "active",
                        "returned"
                      ]
                    ]
                  },

                ]
              },
              {
                $and: [
                  {
                    $eq: [
                      "$state",
                      "booked"
                    ]
                  },
                  {
                    $lte: [
                      "$startDate",
                      new Date()
                    ]
                  },
                  {
                    $gte: [
                      "$startDate",
                      ISODate("2019-12-18T07:00:00.000Z")
                    ]
                  }
                ]
              }
            ]
          },
          true,
          false
        ]
      }
    }
  }
])

उपरोक्त में, $cond कथन में निम्नलिखित पंक्तियाँ बिल्कुल भी काम नहीं करती हैं:

$eq: [
   "$listing.0.inspectionStatus",
   "none"
]

मेरा प्रश्न है - मैं उपरोक्त कार्य कैसे करूँ? ध्यान दें कि लुकअप के बाद listing फ़ील्ड में हमेशा केवल एक सरणी आइटम होता है (वहां एक से अधिक सरणी आइटम कभी नहीं)। मैंने $listing.$0.$inspectionStatus जैसे विभिन्न रूपों की कोशिश की है - लेकिन कुछ भी काम नहीं कर रहा है। मैं group और filter पर शोध करने की दिशा में नीचे जा सकता हूं - लेकिन मुझे ऐसा लगता है कि यह अधिक है जब मैं हमेशा listing सरणी में पहली और एकमात्र वस्तु का उपयोग करना चाहता हूं।

0
deblearns1 21 पद 2019, 07:00

1 उत्तर

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

कृपया $cond कीवर्ड में $eq कीवर्ड के बजाय $in कीवर्ड का उपयोग करें

db.demo1.aggregate([
      {
        $lookup: {
          from: "demo2",
          localField: "listingId",
          foreignField: "_id",
          as: "listing"
        }
      },
      {
        $match: {
          $and: [
            {
              locationId: ObjectId("5c0f0c882fcf07fb08890c27")
            },
            {
              $or: [
                {
                  $and: [
                    {
                      state: "booked"
                    },
                    {
                      startDate: {
                        $lte: new Date()
                      }
                    },
                    {
                      startDate: {
                        $gte: ISODate("2019-12-18T07:00:00.000Z")
                      }
                    }
                  ]
                },
                {
                  $and: [
                    {
                        listing: {
                            $elemMatch: { 
                                inspectionStatus: "none" 
                             }
                        }
                    },
                    {
                      endDate: {
                        $lte: new Date()
                      }
                    },
                    {
                      endDate: {
                        $gte: ISODate("2019-12-18T07:00:00.000Z")
                      }
                    },
                    {
                      state: {
                        $in: [
                          "active",
                          "returned"
                        ]
                      }
                    }
                  ]
                },
                {
                  $and: [
                    {
                      state: {
                        $ne: "cancelled"
                      }
                    },
                    {
                      $or: [
                        {
                          $and: [
                            {
                              startDate: {
                                $gte: ISODate("2019-12-20T07:00:00.993Z")
                              }
                            },
                            {
                              startDate: {
                                $lte: ISODate("2019-12-21T06:59:59.999Z")
                              }
                            }
                          ]
                        },
                        {
                          $and: [
                            {
                              endDate: {
                                $gte: ISODate("2019-12-20T07:00:00.993Z")
                              }
                            },
                            {
                              endDate: {
                                $lte: ISODate("2019-12-21T06:59:59.999Z")
                              }
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      },

      {
        $addFields: {
          isLate: {
            $cond: [
              {
                $or: [
                  {
                    $and: [
                      {
                        $in: [
                            "none",
                            "$listing.inspectionStatus",

                        ]
                      },
                      {
                        $lte: [
                          "$endDate",
                          new Date()
                        ]
                      },
                      {
                        $gte: [
                          "$endDate",
                          ISODate("2019-12-18T07:00:00.000Z")
                        ]
                      },
                      {
                        $in: [
                          "$state",
                          [
                            "active",
                            "returned"
                          ]
                        ]
                      },

                    ]
                  },
                  {
                    $and: [
                      {
                        $eq: [
                          "$state",
                          "booked"
                        ]
                      },
                      {
                        $lte: [
                          "$startDate",
                          new Date()
                        ]
                      },
                      {
                        $gte: [
                          "$startDate",
                          ISODate("2019-12-18T07:00:00.000Z")
                        ]
                      }
                    ]
                  }
                ]
              },
              true,
              false
            ]
          }
        }
      }
    ])
1
Mahesh Bhatnagar 21 पद 2019, 06:14