سؤال

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

أريد الاستئصال عن الأعضاء الحاليين في المجموعة. "الحالية" تعني أن وقت البدء أقل من الوقت الحالي، ووقت انتهاء الصلاحية أكبر من الوقت الحالي أو NULL.

هذا الاستعلام الشرطي يحظرني تماما. يمكنني القيام بذلك عن طريق تشغيل استفسارتين ودمج النتائج، ولكن يبدو ذلك قبيحا ويتطلب التحميل في جميع النتائج في وقت واحد. أو استطعت افتراضي وقت انتهاء الصلاحية في تاريخ التعسفي في المستقبل البعيد، لكن هذا يبدو حتى قصفا ويحتمل أن يكون هشا. في SQL، أعرب عن ذلك فقط مع "(انتهاء الصلاحية> = الآن ()) أو (انتهاء صلاحية فارغة) - لكنني لا أعرف كيف أفعل ذلك في Mongo.

أيه أفكار؟ شكرا جزيلا مقدما.

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

المحلول

فقط اعتقدت أنك سأتحديث أي شخص في حالة تعثر في هذه الصفحة في المستقبل. اعتبارا من 1.5.3، يدعم Mongo الآن $ أو مشغلا حقيقيا: http://www.mongodb.org/display/docs/advanced+ass#adlies#

استعلامك من "(انتهاء الصلاحية = = الآن () الآن ()) أو (انتهاء صلاحية فارغة)" يمكن الآن تقديمها على النحو التالي:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]}

نصائح أخرى

في حالة العثور على أي شخص مفيد، www.querymongo.com. هل الترجمة بين SQL و MongoDB، بما في ذلك أو بنود. يمكن أن يكون مفيدا حقا لمعرفة بناء الجملة عندما تعرف ما يعادل SQL.

في حالة أو تصريحات، يبدو هذا

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';

MongoDB:

db.collection.find({
    "$or": [{
        "columnA": 3
    }, {
        "columnB": "string"
    }]
});

كائنات الاستعلام في Mongo افتراضيا وتعبيرات معا. لا يشمل Mongo حاليا A أو المشغل لهذه الاستفسارات، ومع ذلك، هناك طرق للتعبير عن هذه الاستفسارات.

استخدم "في" أو "أين".

سيصبح شيئا مثل هذا:

db.mycollection.find( { $where : function() { 
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );

db.lead.find (

{"name": {'$regex' : '.*' + "Ravi" + '.*'}},
{
"$or": [{
    'added_by':"arunkrishna@aarux.com"
}, {
    'added_by':"aruna@aarux.com"
}]
}

);

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

regex فارغ أو maxkey (إذا كانت اللغة تدعمها) هي خيارات جيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top