sql >> Database teknologi >  >> NoSQL >> MongoDB

Skema for åbningstider MongoDB

Tak, Yeggeps, for listen over krav.

Dette er et revideret svar baseret på dine krav. Selvfølgelig er der ingen hellig gral at skemae, men jeg vil gerne motivere mit svar før revision (at holde en flad struktur er let at forespørge og vedligeholde) med nogle eksempeldata + forespørgsler baseret på din kravliste. Jeg gentager, jeg siger ikke, at dette er den bedste løsning, men det er en løsning, som er ligetil at forespørge på og nem at vedligeholde (imho).

Koden er lidt hurtig og beskidt, undskyld. Dataene:

[
  # 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

Vis åbningstider og ekstraordinære datoer separat:

# 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

Hvilke biblioteker er åbne i dag?

# 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

Producerer output som følger:

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'

Indrømmet, ulempen ved min foreslåede løsning er, at den ikke fanger alle krav i én forespørgsel.



  1. Eksponer MongoDB på Kubernetes med StatefulSets uden for klyngen

  2. MongoDB - Opret et forhold

  3. hvordan man sorterer array af objekter efter vilkårlig liste i mongo

  4. Redis leder efter env redis url-variabel ikke sikker på, hvor env-variabelen dårlig URI skal placeres (er ikke URI?):(URI::InvalidURIError)