MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Schemat godzin otwarcia MongoDB

Dziękuję Yeggeps za listę wymagań.

To jest poprawiona odpowiedź na podstawie Twoich wymagań. Oczywiście nie ma świętego Graala w schemacie, ale chciałbym uzasadnić moją odpowiedź przed korektą (utrzymanie płaskiej struktury jest łatwe do zapytania i utrzymania) kilkoma przykładowymi danymi + zapytaniami opartymi na liście wymagań. Powtarzam, nie mówię, że to najlepsze rozwiązanie, ale jest a rozwiązanie, które jest proste do zapytania i łatwe w utrzymaniu (imho).

Kod jest trochę szybki i brudny, przepraszam. Dane:

[
  # library "lib1" open on wednesdays from 8:00 until 17:00
  {"lib_id" => "lib1", "type" => "hours", "opening" => 800, "closing" => 1700, "day_of_week" => 3},
  # library "lib1" open on wednesdays from 19:00 until 22:15
  {"lib_id" => "lib1", "type" => "hours", "opening" => 1900, "closing" => 2215, "day_of_week" => 3},
  {"lib_id" => "lib1", "type" => "hours", "opening" => 800, "closing" => 1700, "day_of_week" => 4},
  {"lib_id" => "lib2", "type" => "hours", "opening" => 1100, "closing" => 1700, "day_of_week" => 3},
  {"lib_id" => "lib2", "type" => "hours", "opening" => 1400, "closing" => 1700, "day_of_week" => 4},
  {"lib_id" => "lib2", "type" => "hours", "opening" => 1900, "closing" => 2100, "day_of_week" => 4},
  # library lib1 closed on wednesday december 7th 2011
  {"lib_id" => "lib1", "type" => "closed_on", "reason" => "Rearranging the shelves", "closed_date" => Time.utc(2011, 12, 8)},
  {"lib_id" => "lib2", "type" => "closed_on", "reason" => "We are closed for the holidays", "closed_date" => Time.utc(2011, 12, 7)}
].each do |schedule|
  coll.save(schedule)
end

Pokaż osobno godziny otwarcia i wyjątkowe daty:

# List all the library id's distinctly
coll.distinct("lib_id").each do |lib_id|
  puts "\nLibrary #{lib_id} opening hours:\n--- "
  # I need to be able to show the opening hours in correlation with the Library
  # Find all the opening hour information for current library
  coll.find({"lib_id" => lib_id, "type" => "hours"}).each do |schedule|
    puts " #{Date::DAYNAMES[schedule["day_of_week"]]}s: #{schedule["opening"]} - #{schedule["closing"]}" if schedule["type"] == "hours"
  end

  # I need to show an indication if it's open or closed in correlation with the Library.
  puts "This library will be closed on: "
  # Find all the exceptions for current lib_id -- introduce a time-period restriction using Date.utc (...)
  coll.find({"lib_id" => lib_id, "type" => "closed_on"}).each do |closed|
    puts " #{closed["closed_date"].strftime("%a %B%e, %Y")}: #{closed["reason"]}"
  end
end

Które biblioteki są dziś otwarte?

# I need to be able to query on what's open right now or some time in the future with minute granularity
# here I'll also need to be able to exclude the Librarys that has added exceptions for the given time/day
puts "---"
qtime = (Time.now.hour * 100) + Time.now.min # minute granularity
qwday = Time.now.wday  # this example only shows today
qclosed = Time.utc(Time.now.year, Time.now.mon, Time.now.mday)
# Query for all library ids which have opening times for this weekday, at this hour (+minutes)
coll.find({"opening" => {"$lte" => qtime}, "closing" => {"$gte" => qtime}, "day_of_week" => qwday}, {:fields => "lib_id"}).each do |lib|
  # Check whether current library has an exception for this specific day
  closed = coll.find_one({"lib_id" => lib["lib_id"], "closed_date" => qclosed})
  if closed
    # If an exception record was encountered, print the reason
    puts "Library #{lib["lib_id"]} is normally open right now, but is now closed: '#{closed["reason"]}'"
  else
    # Else: the library is open
    puts "Library #{lib["lib_id"]} is open right now! (#{Time.now.strftime("%a %B%e %Y, %H:%M")})"
  end
end

Generuje dane wyjściowe w następujący sposób:

Library lib1 opening hours:
--- 
 Wednesdays: 800 - 1700
 Wednesdays: 1900 - 2215
 Thursdays: 800 - 1700
This library will be closed on: 
 Thu December 8, 2011: Rearranging the shelves

Library lib2 opening hours:
--- 
 Wednesdays: 1100 - 1700
 Thursdays: 1400 - 1700
 Thursdays: 1900 - 2100
This library will be closed on: 
 Wed December 7, 2011: We are closed for the holidays
---
Library lib1 is open right now! (Wed December 7 2011, 13:12)
Library lib2 is normally open right now, but is now closed: 'We are closed for the holidays'

Trzeba przyznać, że wadą proponowanego przeze mnie rozwiązania jest to, że nie obejmuje ono wszystkich wymagań w jednym zapytanie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Co to jest pula połączeń i limit czasu?

  2. (mangusta/obietnice) Jak sprawdzić, czy dokument został utworzony za pomocą findOneAndUpdate z upsert

  3. MongoDB Jak wykonać zapytanie za pomocą operatora $date?

  4. Nie można połączyć Robomongo za pomocą obrazu dokowanego MongoDB

  5. Jak połączyć się z mongodb za pomocą sailsjs v0.10?