1. BASICDBOBJECT
แบบสอบถามการรวมทั้งหมดคือการนับจำนวนผู้ใช้ในสถานะต่าง ๆ ของผู้ใช้เป็นสถานการณ์:
1. เกณฑ์ตัวกรอง:
วันที่เป็นวันที่สอบถาม:
basicDbObject query = new BasicDbObject (); query.put ("เวลา", ใหม่ BASICDBOBJECT ("$ gte", วันที่ + "00:00:00") .Append ("$ lte", วันที่ + "23:59:59")));หากมีหลายเงื่อนไข: เพิ่ม query.put ("สถานะ", 0);
หากมีหรือตัวกรอง:
ค่า basicDbList = ใหม่ basicDBLIST (); Values.add (ใหม่ BasicDbObject ("สถานะ", ใหม่ BASICDBOBJECT ("$ Exise", FALSE))); Values.add (ใหม่ BasicDbObject ("สถานะ", 0)); query.put ("$ หรือ", ค่า);ในกรณีที่ใหม่ BasicDbObject ("$ Exise", False)) หมายความว่าไม่มี "สถานะ" (เอกสาร MongoDB ไม่สามารถเท่ากับฟิลด์เอนทิตี)
2. การจับคู่การจับคู่
DBOBJECT MATCH = ใหม่ BASICDBOBJECT ("$ match", แบบสอบถาม);ใส่แบบสอบถามก่อนหน้าลงในตัวกรอง Macth
3. เงื่อนไขการประกบและการจัดกลุ่ม
ขั้นตอนนี้เทียบเท่ากับกลุ่ม SQL โดย
basicDbObject groupby = new basicDboBject (); // เงื่อนไขการจัดกลุ่ม groupby.put ("userId", "$ userId"); // กลุ่มตามรหัสผู้ใช้เช่นเดียวกับขั้นตอนการกรองในขั้นตอนแรกหากมีหลายกลุ่มคุณสามารถเพิ่มลงในสิ่งต่อไปนี้: GroupBy.put ("สถานะ", "สถานะ");
4. ข้อความค้นหาโพสต์-กลุ่ม
ประกบกันครั้งแรกกลุ่ม:
dbObject select = new basicDbobject ("_ id", groupby);หากเราต้องการใช้งานข้อมูลที่จัดกลุ่ม: (นี่คือสถิติของผู้ใช้)
select.put ("count", ใหม่ basicDbObject ("$ sum", 1));5. Splice $ Group
dbObject Group = ใหม่ basicDbObject ("$ group", เลือก);จนถึงตอนนี้. มาประกบคำสั่ง MongoDB สิ้นสุดที่นี่
มาเริ่มการดำเนินการแบบสอบถาม:
นำเข้า com.mongoDb.aggregationOutput; นำเข้า org.springframework.data.mongoDb.core.mongotemplate; aggregationOutput เอาต์พุต = mongotemplate.getCollection ("นี่คือชื่อตารางข้อมูลของ MongoDB")อ่านผลการสอบถาม:
iterable <DbObject> map = output.results (); // transpor mapfor (dboBject dBoBject: map) {// แผนที่อ่านที่นี่คือ {"_id": {"userId": 1, "สถานะ" 0}} ... แผนที่ <สตริง //transfer.0 Integer userId = integer.parseint (commutil.toString (ausgmap.get ("userId")) แทนที่ (". 0", "")); // ที่นี่เราสามารถใช้งานข้อมูลของเราได้ จำนวนเต็มนับ = จำนวนเต็มพารามิเตอร์ (commutil.toString (dbobject.get ("count"))); -2. dbobject
หากไม่มีความกังวลใจเพิ่มเติมหากคุณคิดว่าวิธีแรกนั้นเป็นระยะยาวโดยเฉพาะอย่างยิ่งฉันจะนำแบบสอบถามการรวมตัวที่กระชับขึ้นมาให้คุณด้วยรหัสที่รัดกุมมากขึ้น:
เพียงอัปโหลดรหัส
1. ให้ความสนใจกับแพ็คเกจที่นำเข้า:
นำเข้า com.mongodb.dbobject; นำเข้า com.mongoDb.util.json;
2. $ Macth:
(วันที่เริ่มต้นของ Beginday-Query; วันที่สิ้นสุดวันสุดท้ายของวัน)
dbObject match = (dboBject) json.parse ("{$ match: {'status': '1', 'time': {$ gte: '"+Beginday+"', $ lte: '" endday+"'}}}");3. $ กลุ่ม:
(จัดกลุ่มตาม USERID นับจำนวนผู้ใช้สะสมค่าฟิลด์ AMOUT และใช้ค่าสูงสุดของฟิลด์ AMOUT)
dbObject group = (dBoBject) json.parse ("{$ group: {_ id: '$ userId', นับ: {$ sum: 1}, ทั้งหมด: {$ sum: '$ จำนวน'}, maxsigle: {$ max: '$}}}");หลังจากเงื่อนไขถูกประกบแล้วให้เริ่มสอบถาม:
รายการ <DbObject> list = new ArrayList <DbObject> (); list.add (จับคู่); list.add (กลุ่ม); outgregationOutput output = mongotemplate.getCollection ("ชื่อตาราง"). การรวม (รายการ);ไม่จำเป็นต้องพูดถึงผลการสำรวจ ข้างต้นได้รับการอธิบายในรายละเอียด
วิธีที่สองง่ายกว่าวิธีอื่นมากหรือไม่? แต่มันทดสอบความคุ้นเคยกับคำสั่ง MongoDB
【ขยาย】
จากนั้นวิธีการข้างต้นจะขยายออกไป
// สถานะคือ 0 หรือ 1; พิมพ์ไม่ได้ 11; Time dbObject match = (dboBject) json.parse ("{$ match: {'status': {$ in: ['0', '1']}, ประเภท: {$ ne: 11}, 'เวลา': {$ gte: '+Beginday+", $ lte:'+endday+" ครั้งสุดท้ายที่ dbObject Group = (dBoBject) json.parse ("{$ group: {_ id: '$ userid' นับ: {$ sum: 1}, ครั้งสุดท้าย: {$ max: '$ time'}}}"); // json.parse ("{$ match: {count: {$ gte: 100}}}"); // $ project ---- ควรแสดงฟิลด์ใดในผลลัพธ์การสืบค้นและการแสดงผลถูกตั้งค่าเป็น 1. ฟิลด์ _id (ฟิลด์) ไม่จำเป็นต้องแสดงดังต่อไปนี้ collection name.aggregate ([{$ project: {_id: 0, count: 1, lastsucctime: 1}}]) dbobject project = (dbobject) json.parse ("{$ project: {id: 1, count: 1, lastsucctime: 1}"); json.parse ("{$ sort: {'count':-1}}"); // รายการการเรียงลำดับ <Dbobject> list = new ArrayList <DBObject> (); list.add (จับคู่); list.add (กลุ่ม); list.add (groupmatch); list.add ชื่อ ") .aggregate (รายการ); // ผลการสอบถาม3. คำสั่ง basicDbObject+สคริปต์
basicDbObject groupIndex = ใหม่ basicDbObject (); basicDbObject dischealQuery = new BasicDbObject (); districtQuery.put ("userId", ใหม่ BASICDBOBJECT ("$ in", userIds); ข้อมูลของ database.prev หมายถึงผลลัพธ์การสืบค้น // prev.count การนับที่นี่คือการนับของสตริงขั้นตอนก่อนหน้า) ลดลง = "ฟังก์ชั่น (doc, prev) {ถ้า (doc.status == 0) {prev.count+= 1;};}"; getCollection ("คอลเลกชัน"). Group (GroupIndex, DischealQuery, Initindex, ลด, NULL);ในที่สุดคุณสามารถรับผลลัพธ์ได้ด้วยการวนรอบรายการ [PS: มีข้อ จำกัด เกี่ยวกับวิธีการรวมกลุ่มนี้ ---> จะมีข้อผิดพลาดหากเกิน 20,000 ข้อมูล]
ข้างต้นคือสิ่งที่ฉันใช้การประมวลผลการรวม MongoDB ในการประมวลผลธุรกิจทั่วไป หากมีวิธีที่ดีกว่าหรือสิ่งที่ต้องการการปรับปรุงโปรดฝากข้อความถึงฉัน ~