मैं बाजार अद्यतनों की एक समय श्रृंखला को विभाजित करने और दस्तावेज़ आकार से अधिक से बचने के लिए बाल्टी पैटर्न का उपयोग कर रहा हूं (स्थानांतरण ओवरहेड चिंता का विषय नहीं है)। प्रत्येक दस्तावेज़ में ३०,००० अद्यतन होते हैं और मुझे उन अद्यतनों को एक सरणी में 'marketId' से मेल खाने वाले सभी दस्तावेज़ों से वापस करने की आवश्यकता होती है (उम्मीद है कि क्रमबद्ध)।

आंकड़े:

{
  _id: 60617172eca858909eace71f,
  marketId: '1.278363651',
  eventId: 5697224,
  marketType: 'OVER_UNDER_15',
  size: 30000,
  updates: [ 
  {
      t: 1616998770482.0,
      p: 36.49
  }, 
  {
      t: 1616998770482,
      p: 87.77
  },
  // ... 29998 more
  ]
},

वांछित परिणाम:

[
  { t: 1616998770482, p: 36.49 },
  { t: 1616998770482, p: 16.59 },
  { t: 1616998770482, p: 40.38 },
  ... // sorted by t
}

यह एक एकत्रीकरण के साथ मेरा निकटतम प्रयास है:

const result = await db.collection('markets').aggregate(
  { $match: { marketId: marketId } },
  { $project: { _id: 0, updates: 1 } },
  { $unwind: "$updates" },
  { $unwind: "$updates" },
).toArray();

आउटपुट:

[
  { updates: { t: 1616998770482, p: 36.49 } },
  { updates: { t: 1616998770482, p: 16.59 } },
  { updates: { t: 1616998770482, p: 40.38 } },
  ... // actually gives me all of them
}

मैं "अपडेट" को कैसे हटा सकता हूं और वास्तविक वस्तु तक पहुंच सकता हूं?

3
Esteban Ortega 30 मार्च 2021, 06:17

1 उत्तर

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

डेमो - https://mongoplayground.net/p/Dw7NAn9EoEd

$replaceRoot का इस्तेमाल करें

db.collection.aggregate([
  { $match: { marketId: marketId } },
  { $project: { _id: 0, updates: 1 }},
  { $unwind: "$updates" },
  { $replaceRoot: { newRoot: "$updates" } }
])
0
Tushar Gupta - curioustushar 30 मार्च 2021, 07:10
1
यह काम!! पता चला कि मैं एकत्रीकरण सूचीबद्ध करने के लिए [] नोटेशन का उपयोग करना भूल गया था, इसलिए यह ठीक से निष्पादित नहीं हो रहा था। रिप्लेसरूट पूरी तरह से काम करता है। धन्यवाद तुषार :)
 – 
Esteban Ortega
30 मार्च 2021, 18:11