Re: Mongo DB query on pre aggregated list field size

From: Virendra Agarwal <agarwal.viren@xxxxxxxxx>
To: mongodb-user <mongodb-user@xxxxxxxxxxxxxxxx>
Date: Wed, 13 Apr 2016 20:56:08 -0700 (PDT)
Why ads?
Hi Kevin,

Thanks for detailed answer.
This function requires find and update. I was trying to build it using 
single update only but i seems it is not the case here.

With data volume i think i will go with aggregation and then update 
operation at some interval as it will reduce the concurrent find and update 
to 1/3rd operations.

Thanks
Virendra Agarwal




On Thursday, 14 April 2016 04:25:44 UTC+5:30, Kevin Adistambha wrote:

Hi Virendra,

The thing is i need to increment it once in day so (that would be tricky 
if you can suggest me something for that).

The function may need to do:

   1. Try to find a document for a given uid and today’s day number (i.e. 
   using Javascript getDay() 
   <https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay>
   ) 
   2. If not found, then this is the first time the user logs in this day:
      - increment day_count. 
      - create a new document if this is the first time the user logs in 
      this week. 
   3. Increment weekly & daily access counters. 

An example mongo shell Javascript function of the above steps may look 
like:

function updateAccessCount(uid, week_no) {

  // Get today's day of the week
  var day = (new Date()).getDay();

  // Step 1: try to find a document for a given uid and today's day
  var find_doc = {"uid":uid, "week_no":week_no};
  find_doc["day."+day] = {"$exists":true};

  // Step 2: if not found, then this is the first time the user logs in today:
  // - increment day_count
  // - create a new document if this is the first time the user logs in this week
  if (db.date.find(find_doc).itcount() == 0) {
    db.date.update(
      {"uid":uid, "week_no":week_no}, 
      {"$inc":{"day_count":1}, "$set":{"week":week_no}}, 
      {"upsert":true}
    );
  }

  // Step 3: increment weekly & daily access count
  var update_doc = {"$inc":{"count":1}};
  update_doc["$inc"]["day."+day] = 1;
  db.date.update(
    {"uid":uid, "week_no":week_no}, 
    update_doc
  );

}

In the function above, the variable week_no denotes the week of the year, 
to differentiate between one week and another (since this is a weekly 
pre-aggregated report).

Please note that the function above is just an example, and not at all 
tested.

Best regards,
Kevin



-- 
You received this message because you are subscribed to the Google Groups "mongodb-user"
group.

For other MongoDB technical support options, see: https://docs.mongodb.org/manual/support/
--- 
You received this message because you are subscribed to the Google Groups "mongodb-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to mongodb-user@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/mongodb-user.
To view this discussion on the web visit https://groups.google.com/d/msgid/mongodb-user/dfe282e3-d77d-4f2c-8f66-53e62aac5aba%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Why ads?