You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
5.6 KiB
Plaintext

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

00:01 It's time to look at the atomic updates.
00:03 We already talked about the whole document updates and how they work,
00:05 but sometimes it's not really what you want;
00:08 in the beginning when we talked about NoSQL,
00:10 we saw that the NoSQL databases gave up things
00:12 that traditional relational databases embraced or considered sacred.
00:17 One of those where the acid properties, or some part of the acid properties
00:21 and MongoDB does say look things like joints and transactions,
00:24 transactions mainly being part of the acid properties
00:27 is something that MongoDB doesn't promise
00:30 so this whole document updates really require an additional layer in the app tier
00:35 called optimistic concurrency, and usually it's fine,
00:38 sometimes it's not, and you can catch it and say hey look
00:41 somebody saved this out from under you
00:44 and you do want to keep your changes, their changes,
00:45 there's things you can do about those types of situations,
00:47 but not in the database in your app.
00:50 On the other hand, MongoDB does support atomic transactional behavior
00:54 long as it happens on a single document,
00:57 so if we have a document and let's go ahead and create
01:00 a whole new collection here called BookReads
01:03 notice it doesn't exist yet, and we're going to insert just an isbn
01:05 and then how many times it's been read,
01:08 I think of like the Goodreads service or something like that,
01:10 like I want to know how many of my friends read this book,
01:13 we'll you a simple, simple version of that.
01:15 So let's go over here and notice we inserted one and if I refresh,
01:18 we should now have that in here in our one record, like so.
01:22 So we could go and we could do this for this whole document style things,
01:26 I could say book and of course we will be doing this in Python very likely
01:33 we're just about to leave the Javascript in the dust,
01:36 so let's just print out our book that we got here,
01:39 notice this has actually given us the same thing back,
01:41 and we could say the read count += 1, we could increment that,
01:47 and then we could say go over here to the same collection,
01:50 we could say update, I would like to update with this,
01:55 here's the where clause, and the thing I want to update with is the book,
01:58 so let's say _id : book._id, okay, so this should do that like so,
02:07 and let's run one more query here at the end to get it back, to see it again.
02:12 Oh yes, find is not going to work, find one however,
02:19 we don't want to update a whole query,
02:21 whatever that means it doesn't make any sense
02:23 but let's get one of them back, we know this is really going to be unique
02:25 and then let's make this change, ok
02:27 so notice, now we've got a read count of one, we do this a few times, bam bam
02:32 a read count is incrementing over and over and over down here,
02:35 and we're updating one record,
02:37 so this is cool but this is not part of the acid property guarantees,
02:40 this could be problematic in lots of ways
02:43 so what we're going to look at now, are the operators that we can use
02:46 to basically do almost transactional stuff
02:49 and do it in a much more high performance way.
02:52 So let's go over here again, and let me grab this little clause here,
02:57 all right so we got our document back again
02:59 and now what we're going to do, is we're going to do our db
03:03 let me just grab this collection bit,
03:06 and we're going to do our update, in fact update is going to look almost the same,
03:09 we are going to do this, but instead of passing the whole document
03:16 we're going to pass just an in place atomic operator,
03:18 all right so what are we going to do, let's suppose we want somebody
03:23 to basically do the same thing, increment that
03:26 alright, I guess we could just use isbn, that works as well right;
03:32
03:37 we're going to need something in our little where clause here, isbn will do.
03:41 Now by default, this is going to replace whatever's in there,
03:44 that's going to be bad, but what we really want to do is
03:47 we want to increment that one value, so we can use another operator,
03:50 say inc for increment, and then what do I want to increment,
03:58 I want to increment let's see what is it called— ReadCount,
04:04 so I want to increment ReadCount by one,
04:07 I could increment it by negative one, I could increment it by ten.
04:10 So let's run this, now notice we updated one record
04:13 and let's put this in a way that looks better, nine, ten, eleven, twelve—
04:18 there we go, check that out, isn't that cool?
04:21 So what's happening here is it's actually going into Mongo,
04:24 go find the document, just change that number right there,
04:27 just add one to it for me, you don't have to pull the whole thing back,
04:31 make changes and possibly try to put it back and someone else changed it,
04:34 none of those things, this is entirely atomic and safe
04:38 in a multi threaded, multi server environment,
04:42 because MongoDB guarantees individual updates
04:44 to individual documents are atomic
04:47 and because we're not depending on the value,
04:50 we're not like reading it changing in memory and putting it back
04:53 change it in our programs memory not Mongo's and put it back,
04:56 then we're not going to have any problems.
04:58 There's a bunch of cool operators like this
05:00 and we'll see that MongoEngine actually naturally behaves in this style
05:04 not the document style, even though it's an object document mapper
05:08 which is really really delightful.