मेरे पास वस्तुओं की नेस्टेड वस्तु है। संग्रह में प्रत्येक दस्तावेज़ इस तरह दिखता है:

{
   anything: "whatever",
   something: {
      // find inside of these document
      a: { getThis: "wow" },
      b: { getThis: "just wow" },
      c: { getThis: "another wow" }
   }
}

मैं something में प्रत्येक दस्तावेज़ से प्रत्येक getThis में find करना चाहता हूं।


उदाहरण के लिए मैं उस दस्तावेज़ को खोजना चाहता हूँ जिसमें getThis: "wow" है।

मैंने * के साथ वाइल्डकार्ड जैसी किसी चीज़ का उपयोग करने की कोशिश की है:

{"something.*.getThis": "wow" }

मैंने $elemMatch को भी आजमाया है लेकिन ऐसा लगता है कि यह केवल इसके साथ काम करता है array;

{ something: { $elemMatch: { getThis: "wow" } } }
1
Jax-p 3 सितंबर 2020, 18:48

1 उत्तर

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

आप $objectToArray का उपयोग करके देख सकते हैं,

  • $addFields something को somethingArr में सरणी में बदलने के लिए
  • $match शर्त getThis wow है या नहीं
  • $project हटाने के लिए somethingArr
db.collection.aggregate([
  {
    $addFields: {
      somethingArr: { $objectToArray: "$something" }
    }
  },
  { $match: { "somethingArr.v.getThis": "wow" } },
  { $project: { somethingArr: 0 } }
])

खेल का मैदान


दूसरा संभव तरीका

  • $filter इनपुट something सरणी के रूप में, $objectToArray का उपयोग करके कनवर्ट करें
  • फ़िल्टर स्थिति की जाँच करेगा getThis wow के बराबर है या नहीं
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $ne: [
          [],
          {
            $filter: {
              input: { $objectToArray: "$something" },
              cond: { $eq: ["$$this.v.getThis", "wow"] }
            }
          }
        ]
      }
    }
  }
])

खेल का मैदान

1
turivishal 3 सितंबर 2020, 19:01