मेरे पास निम्न प्रारूप में डेटा है:

{ 
    "_id" : ObjectId("5f281caf3494701c38711e96"), 
    "WidgetId" : "0233261", 
    "Specs" : [
        {
            "WidgetType" : "A",
            "AmountLow" : NumberLong(0), 
            "AmountHigh" : NumberLong(0), 
        }, 
        {
            "WidgetType: "A",
            "AmountLow" : NumberLong(0), 
            "AmountHigh" : NumberLong(500), 
        }, 
        {
            "WidgetType" : "A"
            "AmountLow" : NumberLong(1), 
            "AmountHigh" : NumberLong(1000), 
        }
    ]
}

हालांकि डेटा गलत है कि मेरे पास "Specs.AmountLow" = 0 और "Specs.AmountHigh" > 0 का मान नहीं हो सकता है, वे या तो 0/0 या> 0/> 0 होना चाहिए।

"Specs.AmountLow" = 0 और "Specs.AmountHigh" > 0 के विशिष्ट संयोजन वाले दस्तावेज़ों को खोजने का मुझे कोई सौभाग्य नहीं मिल रहा है। यहाँ दो प्रश्न हैं जिनका मैंने बिना सफलता के प्रयास किया है:

प्रयास 1:

db.widgets.find(
    { 
        "Specs.AmountLow" : NumberLong(0), 
        "Specs.AmountHigh" : { 
            "$gt" : NumberLong(0)
        }
    }, 
    { 
        "WidgetId" : 1.0, 
        "Specs.AmountLow" : 1.0, 
        "Specs.AmountHigh" : 1.0
    }
)

उपरोक्त क्वेरी सभी परिणामों को तब तक वापस भेजती है जब तक AmountLow 0 है या AmountHigh 0 से अधिक है, इसलिए उदाहरण डेटा में, सभी सरणी मानों का मिलान किया जाता है, भले ही 0/ >0 मान

मैंने इसे आगे की कोशिश की:

db.widgets.find(
    { 
        "$and" : [
            { 
                "Specs.$.AmountLow" : NumberLong(0)
            }, 
            { 
                "Specs.$.AmountHigh" : { 
                    "$gt" : NumberLong(0)
                }
            }
        ]
    }, 
    { 
        "WidgetId" : 1.0, 
        "Specs.AmountLow" : 1.0,
        "Specs.AmountHigh" : 1.0
    }
);

हालांकि इसने कोई परिणाम नहीं दिया, तब भी जब मेरे पास 0/>0 मान के साथ डेटा की पुष्टि हुई थी

मैं एक क्वेरी कैसे लिखूं जो AmountLow = 0 और AmountHigh > 0 के विशिष्ट उप-दस्तावेज़ संयोजन को ढूंढती है और, एक परिणाम के रूप में, मैं केवल उन रिकॉर्ड्स को AmountLow = 1 के लिए कैसे अपडेट करूं?

अपेक्षित परिणाम:

{ 
    "_id" : ObjectId("5f281caf3494701c38711e96"), 
    "WidgetId" : "0233261", 
    "Specs" : [
        {
            "WidgetType: "A",
            "AmountLow" : NumberLong(0), 
            "AmountHigh" : NumberLong(500), 
        }
    ]
}
1
Kevin O. 9 सितंबर 2020, 19:02

1 उत्तर

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

तुम कोशिश कर सकते हो,

जब आप $-positional का उपयोग करते हैं तो यह सरणी से और सरणी में केवल एक मिलान करने वाला दस्तावेज़ लौटाएगा

  • सरणी तत्व मिलान के लिए $elemMatch का उपयोग करें
  • प्रक्षेपण में सरणी फ़ील्ड नाम के बाद $ स्थितीय का उपयोग करें,
db.widgets.find({
  Specs: {
    $elemMatch: {
      AmountLow: 0,
      AmountHigh: {
        $gt: 0
      }
    }
  }
},
{
  _id: 1,
  WidgetId: 1,
  "Specs.$": 1
})

खेल का मैदान


उपरोक्त उदाहरण के बजाय आप aggregate(), यह उदाहरण सरणी से सभी मिलान करने वाले दस्तावेज़ लौटाएगा,

db.widgets.aggregate([
  {
    $addFields: {
      Specs: {
        $filter: {
          input: "$Specs",
          cond: {
            $and: [
              { $eq: ["$$this.AmountLow", 0] },
              { $gt: ["$$this.AmountHigh", 0] }
            ]
          }
        }
      }
    }
  }
])

खेल का मैदान

1
turivishal 9 सितंबर 2020, 19:24