मैं उन गुणों को कैसे कह सकता हूं जो एक उप संग्रह में दूसरे संग्रह में हैं?

Nov 26 2020

मेरे पास 2 संग्रह हैं: एक को बुलाया placesऔर type_places। a placeने एक प्रकार के स्थान को संबद्ध किया है ( type_places) और इससे कुछ वस्तुएं ( objectsसरणी) जुड़ी हो सकती हैं ।

type_places
{
  "_id": "5fbc7cc705253c2da482023f",
  "type_place": "office",
  "objects": [
    {
      "_id": "5fbc7cc705253c2da48202saw",
      "name": "chair"
    },
    {
      "_id": "5fbc7cc705253c2da4820242",
      "name": "table"
    },
    {
      "_id": "5fbc7cc705253c2da482025f",
      "name": "desktop"
    }
  ]
}

places
{
    "_id": "5fbc7cc705253c2da482025f",
    "place": "Room 5",
    "type_place_id": "5fbc7cc705253c2da482023f", /*"office"*/
    "type_place_objects": [
      {
        "_id": "5fbc7cc705253c2da48202saw", /*chair*/
        "quantify": 4
      },
      {
        "_id": "5fbc7cc705253c2da482025f", /*desktop*/
        "quantify": 2
      }
    ]
  }

तब मैं चाहता हूं कि जब मैं क्वेरी करता हूं place, तो क्वेरी मुझे दिखाती है placeकि मुझे परामर्श दिया गया है, यह किस तरह का है ( type_place) और objectsउस स्थान का किस प्रकार का है

उत्पादन वांछित:

{
  "_id": "5fbc7cc705253c2da482023f",
  "place": "Room 5",
  "type_place_objects": [
    {
      "_id": "5fbc7cc705253c2da48202saw",
      "name": "chair",
      "quantify": 4
    },
    {
      "_id": "5fbc7cc705253c2da482025f",
      "name": "desktop",
      "quantify": 2
    }
  ]
}

मैं यह कोशिश कर रहा हूँ, लेकिन काम नहीं कर रहा:

place.aggregate(
[
  {
    "$match": {"place":"Room 5"} }, { "$lookup": {
      "from": "type_place",
      "localField": "type_place_id",
      "foreignField": "_id",
      "as": "type_place_objects"
    }
  },
  {
    "$sort": { "_id": -1 } }, { "$project": {
      "_id":1,
      "place":1,
      "type_place_objects": 1
    }
  }
  
])

इसे कैसे ठीक कर सकते हैं?

जवाब

1 varman Nov 27 2020 at 07:55

कई तरीके हो सकते हैं, एक तरीके का उपयोग कर रहे हैं $lookupजैसा कि आप पहले से ही कोशिश कर रहे हैं

db.place.aggregate([
  { "$match": { "place": "Room 5" } },
  { $unwind: "$type_place_objects"  },
  {
    "$lookup": { "from": "type_place", "let": { tpo: "$type_place_objects._id" },
      "pipeline": [
        { $unwind: "$objects" },
        {
          $match: { $expr: {
              $eq: [ "$objects._id", "$$tpo" ] } } } ], "as": "join" } }, { $addFields: {
      "join": { "$arrayElemAt": [ "$join", 0]
      }
    }
  },
  {
    $addFields: { "type_place_objects.name": "$join.objects.name" }
  },
  {
    $group: { _id: "$_id",
      place: { $first: "$place" },
      type_place_objects: { "$addToSet": "$type_place_objects" }
    }
  }
])

कार्य मानगो खेल का मैदान