def day():
message ="one day is remaining to take up your food"
nextday =datetime.now() + timedelta(days= 1)
nextdaydate= nextday.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
bookingdata =db.booking.find({"$and":[{'date':nextdaydate},{'status':'confirmed'}]})
for data in bookingdata:
user=db.users.find_one({'_id' : data["user"]},{"devicetoken":1})
booking_id=data["_id"]
sendremindpush(user["devicetoken"],str(booking_id),str(message))
在这里,我正在执行cron工作,并希望发送推送通知。所以我需要为此使用两个集合。
bookingdata = db.booking.find({“ $ and”:[{'date':nextdaydate},{'status':'confirmed'}]})
在这一行中,我从预订中获取日期,
user = db.users.find_one({'_ id':data [“ user”]},{“ devicetoken”:1})
在for循环的这一行中,我得到了预订该预订的用户,然后单击下一步
booking_id = data [“ _ id”]
在循环的这一行中,我从上面的二手预订集合中获取预订ID。都在工作,但是很慢。我不喜欢这样。我想减少这两个集合的查找步骤。
我尝试了很多方法,无法优化这两条线。
有什么办法可以减少这些?
最佳答案
您可以使用nosql方法并将用户数据与预订一起存储,并且仅直接从预订数据中获取令牌
def day():
message ="one day is remaining to take up your food"
nextday =datetime.now() + timedelta(days= 1)
nextdaydate= nextday.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
bookingdata =db.booking.find({"$and":[{'date':nextdaydate},{'status':'confirmed'}]})
for data in bookingdate:
user = data['user']
booking_id=data["_id"]
sendremindpush(user["devicetoken"],str(booking_id),str(message))
或者,您可以避免使用多个find_one,而仅执行如下一个查找查询,从而避免多个数据库调用
def day():
message ="one day is remaining to take up your food"
nextday =datetime.now() + timedelta(days= 1)
nextdaydate= nextday.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
bookingdata = []
users = []
for booking in db.booking.find({"$and":[{'date':nextdaydate},{'status':'confirmed'}]}):
bookingdata.append(booking)
users.append(booking['user'])
user_device_token_mappings = dict([(u['_id'),u['devicetoken']) for u in db.users.find({'_id' : {'$in':users}},{"devicetoken":1})])
for data in bookingdate:
booking_id=data["_id"]
device_token = user_device_token_mappings[data["user"]]
sendremindpush(device_token,str(booking_id),str(message))