मैं मोंगो से अच्छी तरह वाकिफ नहीं हूं, इसलिए कृपया यहां किसी भी अज्ञानता के लिए क्षमा करें!

मैं यह निर्धारित करने के लिए प्रत्येक उपयोगकर्ता को देखा गया संदेश ऑब्जेक्ट जोड़ना चाहता हूं कि उपयोगकर्ता ने कौन से संदेश पढ़े हैं या नहीं, जैसा कि संदेश की अद्वितीय आईडी की उपस्थिति (या अनुपस्थिति) द्वारा निर्धारित किया गया है, जैसे कुछ:

// उपयोगकर्ता वस्तु में कुंजी

seenMessages: {
  i3d4Fh87: 'i3d4Fh87',
  hfy7FDE9: 'hfy7FDE9',
}

विचार उस कुंजी के लिए वस्तु की जांच करना है और यदि पता लगाने में असमर्थ है, तो संदेश को 'अनदेखा' माना जाता है। संदेश देखने पर, संदेश आईडी को फिर देखा संदेश ऑब्जेक्ट में जोड़ा जाता है, जिस बिंदु पर इसे 'देखा' माना जाएगा।

क्या मोंगो में इसे हासिल करने का कोई तरीका है? अर्थात् अद्यतन चरण में और साथ ही साथ एक खाली वस्तु के रूप में एक फ़ील्ड बनाना, Schema.Types.Mixed बस शून्य युक्त एक सरणी उत्पन्न करता है।

2
S Q 15 फरवरी 2019, 20:59

2 जवाब

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

मैं ऑब्जेक्ट की बजाय संदेशों को स्टोर करने के लिए एक सरणी का उपयोग करता हूं। Mongo में ढेर सारे ऑपरेटर हैं जो सरणियों पर काम करते हैं और एक जोड़ रहे हैं मल्टीकी इंडेक्स उन कार्यों को तेज कर देगा

  • एक अनदेखी संदेश जोड़ने के लिए, आप कुछ ऐसा करेंगे db.myColl.update(query, {$addToSet: "seenMessages": messageId}}) (जब तक नामित फ़ील्ड पहले से मौजूद नहीं है, mongo इसे एक सरणी के रूप में बनाएगा)
  • किसी संदेश को पढ़ा हुआ चिह्नित करने के लिए, आप $pull -- https: का उपयोग करेंगे: //docs.mongodb.com/manual/reference/operator/update/pull/
  • और यदि आप उन उपयोगकर्ताओं के लिए क्वेरी करना चाहते हैं जिन्होंने संदेश नहीं देखा था, तो क्वेरी को तेज़ बनाने के लिए आपके पास user.seenMessages पर एक अनुक्रमणिका हो सकती है

मुझे पता है कि यह मूल प्रश्न का बिल्कुल उत्तर नहीं देता है, लेकिन वस्तुओं में मनमानी कुंजियों का उपयोग करना एक ऐसा पैटर्न है जिसका समर्थन करने के लिए मोंगो के पास अच्छे उपकरण नहीं हैं। देखें MongoDB Query Help - query उप-ऑब्जेक्ट में किसी भी कुंजी के मूल्यों पर कुछ और विवरण के लिए

1
willis 16 फरवरी 2019, 00:20

वह सही है और अगर मेरे पास प्रतिनिधि योग्य होता तो मैं उसे ऊपर उठा देता। यदि आप वस्तुओं के साथ इसके माध्यम से जाते हैं तो आप इसे @ विलिस की पोस्ट में अंतिम लिंक से विधि में कर सकते हैं, लेकिन किसी सरणी पर एक खोज का उपयोग करना आसान होगा और आईडी को पढ़े जाने पर धक्का देना आसान होगा, मान नहीं होगा उदाहरण के लिए checkIfRead: {type: Array} में जब तक कि इसे findOneAndUpdate विधि के साथ वहां नहीं रखा जाता है। और आप कोई भी तर्क डाल सकते हैं जिसके लिए आप चाहते हैं कि यदि कोई परिणाम नहीं मिलता है क्योंकि यह अस्तित्व में नहीं है।

1
Matt Taliancich 16 फरवरी 2019, 00:42