ฉันจะนับจำนวนรายการทั้งหมดประเภทที่กำหนดเก็บไว้ในที่เก็บข้อมูลของ Google appengine ได้อย่างไร

สิ่งที่ฉันกำลังมองหาโดยพื้นฐานแล้วคือ SQL นี้แปลเป็นเงื่อนไขของ Google AppEngine (สำหรับ Java):

select count(*) from Customers

ดูเหมือนง่ายเพียงพอ แต่จากการอ่านเอกสาร ดูเหมือนว่าฉันจะต้องเรียกใช้แบบสอบถามที่ตรงกับลูกค้าทั้งหมด วนซ้ำและนับผลลัพธ์ โดยคำนึงถึงเพจจิ้งด้วย ฉันไม่ต้องการดึงข้อมูลแต่ละองค์ประกอบออกมา ฉันแค่อยากจะนับมันเท่านั้น

หรืออีกวิธีหนึ่ง มี API ที่จะวนซ้ำรายการทั้งหมดตามประเภทที่กำหนด (ไม่พบ API ที่แน่นอนในขณะนี้) ดูเหมือนว่าจะค่อนข้างไม่มีประสิทธิภาพ ไม่ต้องพูดถึงว่าการเรียกใช้ที่เก็บข้อมูลก็มีโควต้าที่จำกัดเช่นกัน

คำแนะนำใด ๆ ที่จะได้รับการชื่นชม

ขอบคุณมาร์ค


person Community    schedule 21.05.2009    source แหล่งที่มา


คำตอบ (5)


ดังที่ wooble กล่าวไว้ bigtable ไม่รองรับการนับแถวเป็นแนวคิดพื้นฐาน คุณสามารถเขียนฟังก์ชัน wrapper ได้ ดังที่ mcotton พูด แต่ในขณะที่เขาเสนอราคาจากเอกสาร นั่นจะยังคงถูกจำกัดไว้ที่ 1,000 อย่างมาก

เพื่อเอาชนะขีดจำกัดเหล่านี้ คุณจะต้องคงตัวนับที่จะเพิ่มขึ้นทุกครั้งที่ใส่เอนทิตีชนิดนั้นสำหรับเอนทิตีแต่ละประเภทที่คุณต้องการนับ และจะลดลงเมื่อลบเอนทิตีประเภทนั้น

เพื่อให้แอปของคุณสามารถปรับขนาดได้ในระดับสูง คุณอาจต้องการแยกส่วนเคาน์เตอร์ดังกล่าว โปรดดูที่ http://code.google.com/appengine/articles/sharding_counters.html (น่าเสียดายที่ฉันไม่ทราบว่ามีการแปลสูตรนั้นเป็น Java แต่แนวคิดควรเหมือนกัน)

person Alex Martelli    schedule 22.05.2009

ดังที่ mcotton กล่าว ปรากฏว่า count() ในแบบสอบถาม "SELECT __ key __" ที่ไม่มีขีดจำกัดอาจทำสิ่งที่คุณต้องการได้

http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count

นี่เป็นคุณสมบัติที่ค่อนข้างใหม่ใน Google Datastore พวกเขาเคยมีขีดจำกัดที่กำหนดไว้ที่ 1,000 รายการในเรื่องนี้ พวกเขาเพิ่งลบขีดจำกัดนั้นออกเมื่อเร็วๆ นี้ ข้อจำกัดเดียวในตอนนี้คือคิวรีของคุณดำเนินการเร็วพอที่จะไม่หมดเวลาหรือไม่

นอกจากนี้ยังมี Google Mapper API ใหม่ที่คุณสามารถพิจารณาได้ว่านี่เป็นข้อมูลจำนวนมหาศาลจริง ๆ และคุณหมดเวลาเข้าชมหรือไม่ หากต้องการอ่านเพิ่มเติม ให้ค้นหาด้วย Google ด้วยคำว่า [appengine mapreduce]

ฉันยอมรับว่าเป็นเรื่องที่น่าทึ่งมากที่ GQL ไม่รองรับ "SELECT COUNT(*)" นั่นดูเหมือนเป็นการกำกับดูแลเล็กน้อย แต่การเลือกเฉพาะบนคีย์แล้วใช้ count() เพื่อไม่ให้ส่งคีย์เหล่านั้นกลับไปยังแอปควรจะทำงานในลักษณะเดียวกัน

person Greg Linden    schedule 19.08.2010

น่าเสียดายที่ BigTable เป็นไปไม่ได้ที่จะนับเอนทิตีโดยไม่ต้องเรียกใช้การสืบค้นเพื่อให้ตรงกับเอนทิตีทั้งหมด โปรดทราบว่าแอปพลิเคชัน เช่น Google Search และ Google Reader จะไม่ให้จำนวนผลลัพธ์ที่แน่นอนแก่คุณเมื่อคุณมีมากกว่า 1,000 รายการ หากคุณคิดในแง่บวกว่าคุณต้องนับเอนทิตีทั้งหมดของคุณ คุณก็สามารถทำชุดของ การค้นหา key_only จำกัดไว้ที่ 1,000 เอนทิตีแต่ละรายการและเพิ่มจำนวนสำหรับเอนทิตีทั้งหมด

person Wooble    schedule 21.05.2009

นี่เป็นเพียงการคาดเดา แต่ฉันคิดว่าพวกเขาจะใช้วิธีการ count() ใน java ซึ่งคล้ายกับการใช้ python ที่นี่ คือวิธีการ count() สำหรับ Python

นับ(จำกัด)

Returns the number of results this query fetches.

count() is somewhat faster than retrieving all of the data by a constant factor, but the running time still grows with the size of the result set. It's best to only use count() in cases where the count is expected to be small, or specify a limit.

Note: count() returns a maximum of 1000. If the actual number of entities that match the query criteria exceeds the maximum, count() returns a count of 1000.

Arguments:

limit

    The maximum number of results to count.
person mcotton    schedule 22.05.2009
comment
สิ่งนี้จะส่งคืนการนับที่แม่นยำเมื่อมี> 1,000 ผลลัพธ์หรือไม่ - person Paul Tarjan; 03.06.2009

นี่เป็นกระทู้เก่ามาก แต่เผื่อว่าจะช่วยให้คนอื่นดูได้ มี 3 วิธีในการบรรลุเป้าหมายนี้:

  1. การเข้าถึงสถิติ Datastore
  2. การรักษาตัวนับในที่เก็บข้อมูล
  3. เคาน์เตอร์แบ่งปัน

แต่ละวิธีเหล่านี้ อธิบายไว้ในลิงก์นี้

person svpino    schedule 08.03.2015