จะกรองตามคีย์ค้นหาตามช่วงวันที่แล้วรวมตามสัปดาห์ใน mongodb ได้อย่างไร

ฉันมีคอลเลกชัน mongo ชื่อ MyCollection ซึ่งประกอบด้วยเอกสารที่มีลักษณะดังนี้:

{ 
    "_id" : ObjectId("58085384e4b0f70605461e3f"), 
    "uid" : "fa1aeafc-18db-41a5-8ee5-ac0c32428fe1",
    "Key1" : "Value1"  
    "timeStamp" : ISODate("2016-08-23T17:58:20.000+0000"), 
}

เอกสารบางฉบับมี Key1 ในขณะที่บางฉบับมี Key2 หรือ Key3

บัดนี้ข้าพเจ้าปรารถนาที่จะทำดังต่อไปนี้:-

  1. รับเฉพาะเอกสารที่มี Key1 หรือ Key2
  2. จากชุดผลลัพธ์ของเอกสารด้านบน รับเฉพาะเอกสารที่อยู่ในช่วง timeStamp Date(2016, 08, 01) ถึง Date(2016, 08, 31)
  3. สำหรับชุดเอกสารผลลัพธ์ข้างต้น ให้รวบรวมตามสัปดาห์

ฉันจะเขียนแบบสอบถาม mongo สำหรับสิ่งนี้ได้อย่างไร


person Train Heartnet    schedule 14.03.2017    source แหล่งที่มา


คำตอบ (2)


เมื่อใช้กรอบงานการรวม ขั้นตอนข้างต้นสามารถทำได้ด้วย $match และ $group ขั้นตอนไปป์ไลน์ดังต่อไปนี้:

var start = new Date(2016, 7, 1), // months are zero-based indexes i.e Aug month index is 7
    end = new Date(2016, 7, 30); // August month ends on the 30th

db.collection.aggregate([
    { /* filter steps 1 & 2 */
        "$match": {
            "$or": [
                { "Key1": { "$exists": true } },
                { "Key2": { "$exists": true } }
            ],
            "timeStamp": { "$gte": start, "$lte": end }
        }
    },
    { /* group by week */ 
        "$group": {
            "_id": { "$week": "$timeStamp" },
            "count": { "$sum": 1 },
            "uids": { "$push": "$uid" }
        }
    }
])

ข้างต้น ช่วงวันที่จะถูกสร้างขึ้นโดยใช้ _4 Constructor โดยที่เดือนเป็นดัชนีแบบศูนย์ ตัวดำเนินการ $exists ใช้เพื่อ ตรวจสอบการมีอยู่ของคีย์และใช้ $week ตัวดำเนินการรวมวันที่เพื่อรับหมายเลขสัปดาห์ในวันที่ระหว่าง 0 (สัปดาห์บางส่วนที่อยู่ก่อนวันอาทิตย์แรกของปี) และ 53 (ปีอธิกสุรทิน)

สำหรับหมายเลขสัปดาห์ที่เริ่มต้นที่ 1 โดยสัปดาห์ (วันจันทร์ถึงวันอาทิตย์) ที่มีวันพฤหัสบดีแรกของปี MongoDB 3.4 และใหม่กว่าให้ $isoweek โอเปอเรเตอร์สำหรับการใช้งาน

person chridam    schedule 14.03.2017

ลองสิ่งนี้:

db.collection.find(
{$or:[{"key1":{$exists:true}},{"key2":{$exists:true}}],
timeStamp: {$gte: Date(2016, 08, 01), $lte:Date(2016, 08, 31)}
})

ข้อความค้นหาข้างต้นตรงตามเงื่อนไขที่ 1 และ 2 ของคุณ เงื่อนไขที่ 3 ของคุณคืออะไร ฉันไม่เข้าใจอย่างถ่องแท้ โปรดอธิบายอย่างละเอียด

person Vaibhav Patil    schedule 14.03.2017