में एक से अधिक मान द्वारा एक बच्चे के संग्रह का पता कर रहा RavenDB 371 निर्माण का उपयोग कर रहा है और मैं निम्नलिखित मॉडल है:RavenDB
class Product {
public string Id { get; set; }
public ProductSpec[] Specs { get; set; }
}
class ProductSpec {
public string Name { get; set; }
public string Value { get; set; }
}
मैं उत्पादों जो चश्मा का एक सेट है के लिए क्वेरी करने के लिए सक्षम होने के लिए करना चाहते हैं। जब एक भी कल्पना से क्वेरी करने:
session.Query<Product>()
.Where(product => product.Specs.Any(spec => spec.Name == "Color" && spec.Value == "Red"))
.ToList();
की उम्मीद परिणाम नहीं दिए जाते हैं, लेकिन जब एक अतिरिक्त कल्पना विधेय जोड़ा जाता है:
कोई परिणाम नहीं दिए जाते हैं, भले ही पहले क्वेरी द्वारा रिटर्न परिणाम दिए spec नाम "देश" और spec मूल्य "यूएस" के साथ उत्पाद। LuceneQuery विधि का उपयोग करते समय एक ही परिणाम मनाया जाता है। यह this discussion पर एक समान समस्या प्रतीत होता है हालांकि मैं सुझाए गए समाधान को लागू करने में असमर्थ था। विशेष रूप से, सुझाए गए इंडेक्स बनाने के बाद, मुझे नहीं पता कि इसे कैसे पूछना है।
मैं रावेनडीबी में इस प्रकार की क्वेरी का समर्थन कैसे कर सकता हूं?
संपादित
मैं अभी भी यौगिक प्रकार का एक संग्रह पर एक से अधिक मान पर क्वेरी नहीं कर सकता। इसके बजाए, मैंने मॉडल को बदल दिया ताकि एक स्पेक/वैल्यू संयोजन एक समेकित स्ट्रिंग है जैसे कि चश्मा संग्रह तारों की एक सरणी है। यह एक से अधिक मान द्वारा पूछे जा सकता है:
class Product {
public string Id { get; set; }
public int CategoryId { get; set; }
public string[] Specs { get; set; }
}
संदर्भ के लिए, मूल मॉडल और क्वेरी काम करता है जब उनके multikeys सूचकांक की सुविधा के साथ MongoDB का उपयोग कर। MongoDB के साथ बहुत ही आश्चर्यजनक समस्या यह है कि गिनती() ऑपरेशन slow for index queries है। इस प्रकार की क्वेरी पेजिनेशन के लिए आवश्यक है और हालांकि गिनती को कैश किया जा सकता है, मुझे एक समाधान चाहिए जो इसे बॉक्स से बाहर प्रदान करता है। साथ ही, मेरे पास एक अन्य आवश्यकता है जो उत्पादों के मनमाने ढंग से संग्रह के लिए स्पेक समूहों को एकत्रित करने की क्षमता है (उदाहरण के लिए, किसी दिए गए श्रेणी में उत्पादों के लिए सभी spec/value संयोजनों का संग्रह प्राप्त करने के लिए)। मोंगोडीबी में इसे अपनी मैड्रिडस कार्यक्षमता का उपयोग करके हासिल किया जा सकता है, हालांकि मैपरेडस ऑपरेशन के परिणाम स्थैतिक हैं और स्रोत डेटा में परिवर्तन होने पर मैन्युअल रूप से अपडेट किया जाना चाहिए जबकि रावेनडीबी पृष्ठभूमि में स्वचालित रूप से मैपरेडस इंडेक्स अपडेट करता है। इसलिए, हालांकि, रावेनडीबी में मैपरेडस इंडेक्स घोषित करना मोंगोडीबी आईएमओ में जितना बोझिल है, स्वचालित पृष्ठभूमि अपडेट लंबे शॉट से कमियों से अधिक है। मैं CouchDB देख रहा हूं क्योंकि उनके विचार स्वचालित रूप से अपडेट भी होते हैं, हालांकि ऐसा लगता है कि वे मांग पर अपडेट होते हैं, पृष्ठभूमि में स्वचालित रूप से नहीं, यह सुनिश्चित नहीं करते कि यह कोई समस्या होगी या नहीं।
आप यहां इस को हल करने पर चर्चा देख सकते हैं: http://groups.google.com/group/ravendb/browse_thread/thread/dd8a77ccf7322c00/ab97561899624c47 –
मुझे लगता है कि सुझाव मिल गया है समाधान स्ट्रिंग्स की सरणी जैसे सरल प्रकार के संग्रह के लिए काम करता है, लेकिन उत्पाद स्पीकर जैसे कंपाउंड प्रकार का काम नहीं करता है। क्वेरी समाप्त होने पर कोई परिणाम नहीं लौटाता है। – eulerfx