سؤال

أحاول الاستئصال من Google Datastore لشيء مثل (مع PM -> PersistanCanager):

String filters = "(  field == 'value' ||  field == 'anotherValue' )";
Query query = pm.newQuery(myType.class, filters);

عندما تنفذ - أعود: محرك تطبيق DataTore لا يدعم المشغل أو.

ما هو أفضل طريقة في تجربة الناس لهذا النوع من الاستعلامات؟

أي مساعدة في تقديرها!

هل كانت مفيدة؟

المحلول

أداء استفسارات متعددة. لم يتمكن DataStore، مثل جميع قواعد البيانات الأخرى، من تنفيذ الأخحيات بكفاءة. على عكس قواعد البيانات الأخرى، فهي تعرض هذه الصعوبة للمستخدم، لتتحض عليه أن ما تفعله غير فعال. الحل الوحيد هو تنفيذ استعلامات متعددة - واحدة لكل منها أو - ودمجها.

نصائح أخرى

لا أعرف إذا كانت تطبيقات GAE و JPA GAE تدعم هذا، ولكن باستخدام API ذات المستوى المنخفض، يمكنك استخدام المشغل في هذا، في استعلام واحد.

Query query = new Query("Issue");
List<String> list = Arrays.asList("NEW", "OPEN", "ACCEPTED");
query.addFilter("status", FilterOperator.IN, list);

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
PreparedQuery preparedQuery = datastore.prepare(query);
for (Entity entity : preparedQuery.asIterable()) {
    // should iterate over 'NEW', 'OPEN' and 'ACCEPTED' issues
}

وفق جوجل تطبيق التطبيق - الاستعلامات والفهارس:

مرشحات الاستعلام

أ منقي يحدد اسم الحقل، مشغل، وقيمة. يجب توفير القيمة من قبل التطبيق؛ لا يمكن الرجوع إلى خاصية أخرى، أو تحسب من حيث الخصائص الأخرى. يمكن أن يكون المشغل أي مما يلي: < <= == >= >

ملحوظة: لا تدعم واجهة Datastore Java! = وفي مشغلي المرشح المنفذ في واجهة Python DataStore. (في واجهة Python، يتم تنفيذ هؤلاء المشغلين في مكتبات جانب العميل كاستعلامات مؤقتة مؤقتة؛ أنها ليست ميزات Datastore نفسها.)

يمكن أن يكون موضوع المرشح أي حقل كائن، بما في ذلك المفتاح الأساسي والوالدين مجموعة الكيان (انظر المعاملات).

يجب أن تتطابق كيان جميع المرشحات كنتيجة لذلك. في بناء جملة سلسلة jdoql، يتم تحديد مرشحات متعددة مفصولة && (منطقي "و"). لم يتم دعم مجموعات منطقية أخرى من المرشحات (المنطقية "أو"، "لا").

نظرا للطريقة التي ينفذها Dateastore Engine DataStore الاستعلامات، لا يمكن لاستعلام واحد استخدام مرشحات عدم المساواة (< <= >= >) في أكثر من عقار واحد. يسمح بمرشحات عدم المساواة متعددة على نفس الممتلكات (مثل الاستعلام عن مجموعة من القيم). يرى قيود على الاستعلامات.

أساسا أنك سوف تضطر إلى إعادة هيكلة بياناتك حتى تتمكن من العثور على ما تبحث عنه مع شرط واحد أو شروط متعددة أو ستحتاج إلى استرداد البيانات عبر استعلامات اثنين (أو أكثر) وتصفية / الجمع بينها في التعليمات البرمجية الخاصة بك.

آسف أنا متأخرا إلى اللعبة .. لقد ركضت فقط سؤالك اليوم.

هناك طريقة أخرى "محاكاة" "في" و "السلوك" هي استخدام API "المستوى المنخفض". يدعم DataStoreservice طريقة Get () التي تقبل مجموعة من المفاتيح وإرجاع خريطة لجميع الكيانات التي تطابق المفاتيح المرة. إنها واجهة، ولكن هناك DATASTORESSFAMARTORESFALESFAMENT غير متوفر من شأنها الاستغناء عن مثيل جاهز للاستخدام.

لسوء الحظ، قررت Google أنهم لا يرغبون في الترويج لهذا نهج API منخفض المستوى وتفضل استخدام المطورين jdo أو JPA، لذلك لا توجد وثائق متاحة بخلاف Javadocs وأي عينات من التعليمات البرمجية التي قد تجدها عند جوجل "DataStoreservice" وبعد

تلا

أخبار كسر في وقت متأخر .. على الأقل أنا فقط أحصل عليه. عندما كنت أقوم بتنزيل أحدث جافا SDK ل GAE لاحظت على الإصدار ملاحظات "المشكلة 29: تعرض دفعة واحدة" تم إصلاحها في أحدث إصدار (v1.2.1). في الأساس يبدو أننا (أبحث عن نفس الدعم يبدو) قد يكون لديه بديل يستند إلى JDO بدلا من الاضطرار إلى الانسحاب إلى API "المنخفض المستوى". لقد قمت للتو بتنزيل أحدث Java Gae SDK لذلك لم أتمكن من الحصول على فرصة لاختبار أي شيء حتى الآن، لكنني أردت أن أعطيك رؤساء في أسرع وقت ممكن. سأقوم بنشر أي شيء آخر أتعلمه بعد أن أتيحت لي فرصة تأكيد هذا "الإصلاح".

يرجى قبول اعتذاري إذا كسرت آداب Stackoverflow عن طريق إعادة نشر تعليقي كإجابة، لكنني قررت القيام بذلك لسببين. أولا لأنه، على الرغم من أنه يعالج نفس المشكلة مرة أخرى، فإن IMHO يبدو أن هذه المعلومات الجديدة تقدم "إجابة" مختلفة تماما عن المشكلة. وثانيا، كنت قلقا من أن نموذج التعليق قد لا يحصل انتباهك قبل أن تنفق وقتا طويلا في النظر إلى الإجابة الأولى التي قدمتها.

في المرة القادمة سأفكر بعناية أكثر قبل التمثيل.

تلا

قد تكون طريقة واحدة لتبسيط الاضطرار إلى "القيام بذلك بنفسك" لاستخدام الاستعلامات المعلمة:

   Query query = pm.newQuery(mytype.class);
   query.setFilter("field == autoParam");
   query.declareParameters("String autoParam");

   List<String> params = myListOfThingsFieldCanBeEqualTo;

   Set merged = new HashSet();
   for (String f : params) {
     merged.addAll(q.execute(f));
   }

على عكس إجابة كليتوس، أو أعمال جي, في الإصدار الأكثر حداثة من محرك التطبيق على أي حال.

في الواقع، وجدت أو جي لا تعمل في محرك التطبيق 1.3.0 الذي كان لدي، ولكن وفقا ل جوجل تطبيق التطبيق - الاستعلامات والفهارس (نفس كليتوس المصدر المشار إليه في إجابته)،

يجب أن تتطابق كيان جميع المرشحات كنتيجة لذلك. في بناء جملة JDEDQL String، يمكنك فصل مرشحات متعددة مع || (منطقي "أو") و && (منطقي "و")، على الرغم من أن تضع في اعتبارك أنه || لا يمكن توظيفها إلا عند قيام المرشحات التي تفصل بها جميعها بنفس اسم الحقل. بمعنى آخر، || لا يمكن الجمع بين القانونية القانونية فقط في المواقف التي يفصل فيها المرشحات التي تفصل بها في مرشحات واحدة تحتوي على ().

لقد احسبت منذ إجابته (ومنذ آخر آخر تحديث محرك التطبيق الخاص بي)، يجب ترقية محرك التطبيق في هذه المسألة.

تحديث محرك التطبيق إلى 1.3.4، وأعمال أو جي! رغم القيد.

شكرا لكليتوس على أي حال :)

يمكنك استخدام طريقة يحتوي على

String filters = "( :values.contains(field) )";
Query query = pm.newQuery(myType.class, filters);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top