यह एक लंबा शॉट हो सकता है, लेकिन यहाँ हम चलते हैं। मान लें कि मेरे पास निम्नलिखित दस्तावेज़ परिभाषा है:

public class Test1 {
    public ObjectId Id {get;set;}
    public int NonUniqueId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

IMongoCollection<Test1> का उपयोग करके, मैं परिणामों को उन दस्तावेज़ों में फ़िल्टर कर सकता हूं जहां Name = "somevalue", Price द्वारा क्रमबद्ध करें और केवल 10 पंक्तियां लौटाएं।

var builder = Builders.Filters;
var filter = builder.Where(x=>x.Name == "somevalue");

var result = await collection.Find(filter).SortBy(x=>x.Price).Limit(10).ToListAsync();

अब हाथ में सवाल के लिए। यदि फ़िल्टर द्वारा एक से अधिक दस्तावेज़ लौटाए जाते हैं (Name = "somevalue" के साथ) और NonUniqueId उस सेट में एक से अधिक बार आते हैं, तो मैं डुप्लिकेट NonUniqueId को बाहर करना चाहता हूं और केवल एक को वापस करना चाहता हूं न्यूनतम Price

इस तर्क को कोड में लागू करना काफी आसान है: 10 परिणाम प्राप्त करें, यदि उनमें से कोई भी 'डुप्लिकेट' है (यानी NonUniqueId एक से अधिक बार होता है), तो एक को सबसे छोटी कीमत के साथ रखें और इसे छोड़कर दूसरी खोज चलाएं NonUniqueId. हालांकि, इसके लिए कई डीबी कॉल की आवश्यकता होती है जो बहुत अच्छी नहीं है (सबसे खराब स्थिति में 10 तक)।

मोंगोडीबी (सी # ड्राइवर के साथ) में, संपत्ति के आधार पर इन 'डुप्लिकेट' परिणामों को अनदेखा करने का कोई तरीका है और आदर्श रूप से, किसी अन्य संपत्ति का न्यूनतम मिनट (या उसी प्रभाव के लिए कुछ भी) वापस कर दें?

2
Dawid O 25 फरवरी 2020, 11:59

2 जवाब

इस पाइपलाइन को आज़माएं:

db.Product.aggregate([
    {
      $match: { Name: "book" }
    },
    {
      $sort: { Price: 1 }
    },
    {
      $group: {
        _id: "$NonUniqueId",
        product: { $first: "$$ROOT" }
      }
    },
    {
      $replaceWith: "$product"
    }
])

https://mongoplayground.net/p/sqSjiXQhdlF

अपडेट: c# जोड़ा गया

सी # संस्करण आवश्यक प्रक्षेपण के कारण थोड़ा असुविधाजनक है:

var result = collection.AsQueryable()
               .Where(p => p.Name == "book")
               .OrderBy(p => p.Price)
               .GroupBy(p => p.NonUniqueId)
               .Select(g => new Product
               {
                   Id = g.First().Id,
                   Name = g.First().Name,
                   NonUniqueId = g.First().NonUniqueId,
                   Price = g.First().Price
               })
               .ToList();

परीक्षण कार्यक्रम:

using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDB.Entities;
using MongoDB.Entities.Core;
using System.Linq;

namespace StackOverFlow
{
    public class Product : Entity
    {
        public int NonUniqueId { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

    public static class Program
    {
        private static void Main()
        {
            new DB("test");

            var result = DB.Queryable<Product>()
                           .Where(p => p.Name == "book")
                           .OrderBy(p => p.Price)
                           .GroupBy(p => p.NonUniqueId)
                           .Select(g => new Product
                           {
                               ID = g.First().ID,
                               Name = g.First().Name,
                               NonUniqueId = g.First().NonUniqueId,
                               Price = g.First().Price
                           })
                           .ToList();
        }
    }
}
2
Dĵ ΝιΓΞΗΛψΚ 25 फरवरी 2020, 17:18
हाँ... प्रक्षेपण यहाँ मुद्दा होगा। संग्रह को 100000 दस्तावेज़ मिले हैं। मैं विशेष रूप से उन सभी को डाउनलोड करना पसंद नहीं करता, लेकिन आप ड्राइवर से एक कच्ची क्वेरी चला सकते हैं। क्या लिमिट शॉट सर्किट से ग्रुप बनाती है?
 – 
Dawid O
25 फरवरी 2020, 19:17
आप बिना किसी समस्या के सीमित कर सकते हैं। कर्सर afaik पर सीमा लगाई गई है।
 – 
Dĵ ΝιΓΞΗΛψΚ
25 फरवरी 2020, 19:52
सोचा था कि सी # का उपयोग करके कच्चे प्रश्नों को चलाने के बेहतर तरीके से आपकी रुचि हो सकती है। इस लाइब्रेरी पर एक नजर लिखित।
 – 
Dĵ ΝιΓΞΗΛψΚ
26 फरवरी 2020, 13:05
शायद मुझे यहाँ कुछ स्पष्ट याद आ रहा है, मैं collection.AsQueryable() नहीं कर सकता क्योंकि मैं अपने स्थानीय मशीन पर संपूर्ण संग्रह डाउनलोड नहीं करना चाहता। पुस्तकालय के संबंध में, क्या आप अधिक विवरण प्रदान कर सकते हैं कि मेरे द्वारा प्रदान किए गए कोड नमूने के साथ इसे कैसे एकीकृत किया जाए?
 – 
Dawid O
29 फरवरी 2020, 14:21
 – 
Dĵ ΝιΓΞΗΛψΚ
29 फरवरी 2020, 16:22

जैसा कि इस उत्तर में दिखाया गया है, Distinct विधि आज़माएं। आप एक कस्टम Equals फ़ंक्शन भी परिभाषित कर सकते हैं (IEqualityComparer लागू करने वाले वर्ग को परिभाषित करके) जो आपके द्वारा किए जाने वाले चेक को निष्पादित करता है

-1
leqo 25 फरवरी 2020, 16:42
मुझे सी # ऑब्जेक्ट्स की तुलना करने की आवश्यकता नहीं है। मैं चाहता हूं कि मोंगो मेरे लिए हैवी लिफ्टिंग करे।
 – 
Dawid O
25 फरवरी 2020, 16:47