QueryBuilderTest.php 20.7 KB
Newer Older
1 2
<?php

3
class QueryBuilderTest extends TestCase {
4 5 6 7 8 9 10 11 12

	public function tearDown()
	{
		DB::collection('users')->truncate();
		DB::collection('items')->truncate();
	}

	public function testCollection()
	{
Jens Segers's avatar
Jens Segers committed
13
		$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', DB::collection('users'));
14 15 16 17 18 19 20
	}

	public function testGet()
	{
		$users = DB::collection('users')->get();
		$this->assertEquals(0, count($users));

21
		DB::collection('users')->insert(['name' => 'John Doe']);
22 23 24 25 26

		$users = DB::collection('users')->get();
		$this->assertEquals(1, count($users));
	}

Jens Segers's avatar
Jens Segers committed
27 28 29
	public function testNoDocument()
	{
		$items = DB::collection('items')->where('name', 'nothing')->get();
30
		$this->assertEquals([], $items);
Jens Segers's avatar
Jens Segers committed
31 32 33 34 35 36 37 38

		$item = DB::collection('items')->where('name', 'nothing')->first();
		$this->assertEquals(null, $item);

		$item = DB::collection('items')->where('_id', '51c33d8981fec6813e00000a')->first();
		$this->assertEquals(null, $item);
	}

39 40
	public function testInsert()
	{
41 42
		DB::collection('users')->insert([
			'tags' => ['tag1', 'tag2'],
43
			'name' => 'John Doe',
44
		]);
45 46 47 48 49 50 51 52 53

		$users = DB::collection('users')->get();
		$this->assertEquals(1, count($users));

		$user = $users[0];
		$this->assertEquals('John Doe', $user['name']);
		$this->assertTrue(is_array($user['tags']));
	}

54
	public function testInsertGetId()
55
	{
56
		$id = DB::collection('users')->insertGetId(['name' => 'John Doe']);
57
		$this->assertInstanceOf('MongoId', $id);
58 59 60 61
	}

	public function testBatchInsert()
	{
62 63 64
		DB::collection('users')->insert([
			[
				'tags' => ['tag1', 'tag2'],
65
				'name' => 'Jane Doe',
66 67 68
			],
			[
				'tags' => ['tag3'],
69
				'name' => 'John Doe',
70 71
			],
		]);
72 73 74

		$users = DB::collection('users')->get();
		$this->assertEquals(2, count($users));
75
		$this->assertTrue(is_array($users[0]['tags']));
76 77 78 79
	}

	public function testFind()
	{
80
		$id = DB::collection('users')->insertGetId(['name' => 'John Doe']);
81 82 83 84 85

		$user = DB::collection('users')->find($id);
		$this->assertEquals('John Doe', $user['name']);
	}

86 87 88 89 90 91
	public function testFindNull()
	{
		$user = DB::collection('users')->find(null);
		$this->assertEquals(null, $user);
	}

92 93
	public function testCount()
	{
94 95 96 97
		DB::collection('users')->insert([
			['name' => 'Jane Doe'],
			['name' => 'John Doe']
		]);
98 99 100 101 102 103

		$this->assertEquals(2, DB::collection('users')->count());
	}

	public function testUpdate()
	{
104 105 106 107
		DB::collection('users')->insert([
			['name' => 'Jane Doe', 'age' => 20],
			['name' => 'John Doe', 'age' => 21]
		]);
108

109
		DB::collection('users')->where('name', 'John Doe')->update(['age' => 100]);
110 111
		$users = DB::collection('users')->get();

112 113 114 115
		$john = DB::collection('users')->where('name', 'John Doe')->first();
		$jane = DB::collection('users')->where('name', 'Jane Doe')->first();
		$this->assertEquals(100, $john['age']);
		$this->assertEquals(20, $jane['age']);
116 117 118 119
	}

	public function testDelete()
	{
120 121 122 123
		DB::collection('users')->insert([
			['name' => 'Jane Doe', 'age' => 20],
			['name' => 'John Doe', 'age' => 25]
		]);
124 125 126 127 128 129 130 131 132 133

		DB::collection('users')->where('age', '<', 10)->delete();
		$this->assertEquals(2, DB::collection('users')->count());

		DB::collection('users')->where('age', '<', 25)->delete();
		$this->assertEquals(1, DB::collection('users')->count());
	}

	public function testTruncate()
	{
134
		DB::collection('users')->insert(['name' => 'John Doe']);
135 136 137 138 139 140
		DB::collection('users')->truncate();
		$this->assertEquals(0, DB::collection('users')->count());
	}

	public function testSubKey()
	{
141 142
		DB::collection('users')->insert([
			[
143
				'name' => 'John Doe',
144 145 146
				'address' => ['country' => 'Belgium', 'city' => 'Ghent']
			],
			[
147
				'name' => 'Jane Doe',
148 149 150
				'address' => ['country' => 'France', 'city' => 'Paris']
			]
		]);
151 152 153 154 155 156 157 158

		$users = DB::collection('users')->where('address.country', 'Belgium')->get();
		$this->assertEquals(1, count($users));
		$this->assertEquals('John Doe', $users[0]['name']);
	}

	public function testInArray()
	{
159 160 161 162 163 164 165 166
		DB::collection('items')->insert([
			[
				'tags' => ['tag1', 'tag2', 'tag3', 'tag4']
			],
			[
				'tags' => ['tag2']
			]
		]);
167 168 169 170 171 172 173 174 175 176

		$items = DB::collection('items')->where('tags', 'tag2')->get();
		$this->assertEquals(2, count($items));

		$items = DB::collection('items')->where('tags', 'tag1')->get();
		$this->assertEquals(1, count($items));
	}

	public function testRaw()
	{
177 178 179 180
		DB::collection('users')->insert([
			['name' => 'Jane Doe', 'age' => 20],
			['name' => 'John Doe', 'age' => 25]
		]);
181

182 183
		$cursor = DB::collection('users')->raw(function($collection)
		{
184
			return $collection->find(['age' => 20]);
185 186 187 188 189 190
		});

		$this->assertInstanceOf('MongoCursor', $cursor);
		$this->assertEquals(1, $cursor->count());

		$collection = DB::collection('users')->raw();
191
		$this->assertInstanceOf('Jenssegers\Mongodb\Collection', $collection);
Jens Segers's avatar
Jens Segers committed
192

193
		$collection = User::raw();
194
		$this->assertInstanceOf('Jenssegers\Mongodb\Collection', $collection);
195

196
		$results = DB::collection('users')->whereRaw(['age' => 20])->get();
Jens Segers's avatar
Jens Segers committed
197 198
		$this->assertEquals(1, count($results));
		$this->assertEquals('Jane Doe', $results[0]['name']);
199 200 201 202
	}

	public function testPush()
	{
203
		$id = DB::collection('users')->insertGetId([
204
			'name' => 'John Doe',
205 206 207
			'tags' => [],
			'messages' => [],
		]);
208 209

		DB::collection('users')->where('_id', $id)->push('tags', 'tag1');
210

211 212 213 214 215 216 217 218 219 220
		$user = DB::collection('users')->find($id);
		$this->assertTrue(is_array($user['tags']));
		$this->assertEquals(1, count($user['tags']));
		$this->assertEquals('tag1', $user['tags'][0]);

		DB::collection('users')->where('_id', $id)->push('tags', 'tag2');
		$user = DB::collection('users')->find($id);
		$this->assertEquals(2, count($user['tags']));
		$this->assertEquals('tag2', $user['tags'][1]);

221 222 223 224 225 226 227 228 229 230
		// Add duplicate
		DB::collection('users')->where('_id', $id)->push('tags', 'tag2');
		$user = DB::collection('users')->find($id);
		$this->assertEquals(3, count($user['tags']));

		// Add unique
		DB::collection('users')->where('_id', $id)->push('tags', 'tag1', true);
		$user = DB::collection('users')->find($id);
		$this->assertEquals(3, count($user['tags']));

231
		$message = ['from' => 'Jane', 'body' => 'Hi John'];
232
		DB::collection('users')->where('_id', $id)->push('messages', $message);
233
		$user = DB::collection('users')->find($id);
234
		$this->assertTrue(is_array($user['messages']));
235
		$this->assertEquals(1, count($user['messages']));
236
		$this->assertEquals($message, $user['messages'][0]);
237 238

		// Raw
239
		DB::collection('users')->where('_id', $id)->push(['tags' => 'tag3', 'messages' => ['from' => 'Mark', 'body' => 'Hi John']]);
240 241 242
		$user = DB::collection('users')->find($id);
		$this->assertEquals(4, count($user['tags']));
		$this->assertEquals(2, count($user['messages']));
Jens Segers's avatar
Jens Segers committed
243

244
		DB::collection('users')->where('_id', $id)->push(['messages' => ['date' => new MongoDate(), 'body' => 'Hi John']]);
Jens Segers's avatar
Jens Segers committed
245 246
		$user = DB::collection('users')->find($id);
		$this->assertEquals(3, count($user['messages']));
247 248 249 250
	}

	public function testPull()
	{
251 252
		$message1 = ['from' => 'Jane', 'body' => 'Hi John'];
		$message2 = ['from' => 'Mark', 'body' => 'Hi John'];
253

254
		$id = DB::collection('users')->insertGetId([
255
			'name' => 'John Doe',
256 257 258
			'tags' => ['tag1', 'tag2', 'tag3', 'tag4'],
			'messages' => [$message1, $message2]
		]);
259 260

		DB::collection('users')->where('_id', $id)->pull('tags', 'tag3');
261

262 263 264 265 266
		$user = DB::collection('users')->find($id);
		$this->assertTrue(is_array($user['tags']));
		$this->assertEquals(3, count($user['tags']));
		$this->assertEquals('tag4', $user['tags'][2]);

267
		DB::collection('users')->where('_id', $id)->pull('messages', $message1);
268

269
		$user = DB::collection('users')->find($id);
270
		$this->assertTrue(is_array($user['messages']));
271 272 273
		$this->assertEquals(1, count($user['messages']));

		// Raw
274
		DB::collection('users')->where('_id', $id)->pull(['tags' => 'tag2', 'messages' => $message2]);
275 276
		$user = DB::collection('users')->find($id);
		$this->assertEquals(2, count($user['tags']));
277
		$this->assertEquals(0, count($user['messages']));
278 279 280 281
	}

	public function testDistinct()
	{
282 283 284 285 286 287
		DB::collection('items')->insert([
			['name' => 'knife', 'type' => 'sharp',],
			['name' => 'fork',  'type' => 'sharp'],
			['name' => 'spoon', 'type' => 'round'],
			['name' => 'spoon', 'type' => 'round']
		]);
288

289 290
		$items = DB::collection('items')->distinct('name')->get(); sort($items);
		$this->assertEquals(3, count($items));
291
		$this->assertEquals(['fork', 'knife', 'spoon'], $items);
292

293 294
		$types = DB::collection('items')->distinct('type')->get(); sort($types);
		$this->assertEquals(2, count($types));
295
		$this->assertEquals(['round', 'sharp'], $types);
296 297 298 299
	}

	public function testCustomId()
	{
300 301 302 303 304
		DB::collection('items')->insert([
			['_id' => 'knife', 'type' => 'sharp', 'amount' => 34],
			['_id' => 'fork',  'type' => 'sharp', 'amount' => 20],
			['_id' => 'spoon', 'type' => 'round', 'amount' => 3]
		]);
305 306 307 308 309 310

		$item = DB::collection('items')->find('knife');
		$this->assertEquals('knife', $item['_id']);

		$item = DB::collection('items')->where('_id', 'fork')->first();
		$this->assertEquals('fork', $item['_id']);
Jens Segers's avatar
Jens Segers committed
311

312 313 314 315
		DB::collection('users')->insert([
			['_id' => 1, 'name' => 'Jane Doe'],
			['_id' => 2, 'name' => 'John Doe']
		]);
Jens Segers's avatar
Jens Segers committed
316 317 318

		$item = DB::collection('users')->find(1);
		$this->assertEquals(1, $item['_id']);
319 320 321 322
	}

	public function testTake()
	{
323 324 325 326 327 328
		DB::collection('items')->insert([
			['name' => 'knife', 'type' => 'sharp', 'amount' => 34],
			['name' => 'fork',  'type' => 'sharp', 'amount' => 20],
			['name' => 'spoon', 'type' => 'round', 'amount' => 3],
			['name' => 'spoon', 'type' => 'round', 'amount' => 14]
		]);
329

330
		$items = DB::collection('items')->orderBy('name')->take(2)->get();
331
		$this->assertEquals(2, count($items));
332
		$this->assertEquals('fork', $items[0]['name']);
333 334 335 336
	}

	public function testSkip()
	{
337 338 339 340 341 342
		DB::collection('items')->insert([
			['name' => 'knife', 'type' => 'sharp', 'amount' => 34],
			['name' => 'fork',  'type' => 'sharp', 'amount' => 20],
			['name' => 'spoon', 'type' => 'round', 'amount' => 3],
			['name' => 'spoon', 'type' => 'round', 'amount' => 14]
		]);
343

344
		$items = DB::collection('items')->orderBy('name')->skip(2)->get();
345 346 347 348 349 350
		$this->assertEquals(2, count($items));
		$this->assertEquals('spoon', $items[0]['name']);
	}

	public function testPluck()
	{
351 352 353 354
		DB::collection('users')->insert([
			['name' => 'Jane Doe', 'age' => 20],
			['name' => 'John Doe', 'age' => 25]
		]);
355 356 357 358 359 360 361

		$age = DB::collection('users')->where('name', 'John Doe')->pluck('age');
		$this->assertEquals(25, $age);
	}

	public function testList()
	{
362 363 364 365 366 367
		DB::collection('items')->insert([
			['name' => 'knife', 'type' => 'sharp', 'amount' => 34],
			['name' => 'fork',  'type' => 'sharp', 'amount' => 20],
			['name' => 'spoon', 'type' => 'round', 'amount' => 3],
			['name' => 'spoon', 'type' => 'round', 'amount' => 14]
		]);
368 369

		$list = DB::collection('items')->lists('name');
370
		sort($list);
371
		$this->assertEquals(4, count($list));
372
		$this->assertEquals(['fork', 'knife', 'spoon', 'spoon'], $list);
373 374

		$list = DB::collection('items')->lists('type', 'name');
375
		$this->assertEquals(3, count($list));
376
		$this->assertEquals(['knife' => 'sharp', 'fork' => 'sharp', 'spoon' => 'round'], $list);
Jens Segers's avatar
Jens Segers committed
377 378 379 380

		$list = DB::collection('items')->lists('name', '_id');
		$this->assertEquals(4, count($list));
		$this->assertEquals(24, strlen(key($list)));
381 382
	}

383 384
	public function testAggregate()
	{
385 386 387 388 389 390
		DB::collection('items')->insert([
			['name' => 'knife', 'type' => 'sharp', 'amount' => 34],
			['name' => 'fork',  'type' => 'sharp', 'amount' => 20],
			['name' => 'spoon', 'type' => 'round', 'amount' => 3],
			['name' => 'spoon', 'type' => 'round', 'amount' => 14]
		]);
391 392 393 394 395 396 397 398 399 400 401 402 403

		$this->assertEquals(71, DB::collection('items')->sum('amount'));
		$this->assertEquals(4, DB::collection('items')->count('amount'));
		$this->assertEquals(3, DB::collection('items')->min('amount'));
		$this->assertEquals(34, DB::collection('items')->max('amount'));
		$this->assertEquals(17.75, DB::collection('items')->avg('amount'));

		$this->assertEquals(2, DB::collection('items')->where('name', 'spoon')->count('amount'));
		$this->assertEquals(14, DB::collection('items')->where('name', 'spoon')->max('amount'));
	}

	public function testSubdocumentAggregate()
	{
404 405 406 407 408 409
		DB::collection('items')->insert([
			['name' => 'knife', 'amount' => ['hidden' => 10, 'found' => 3]],
			['name' => 'fork',  'amount' => ['hidden' => 35, 'found' => 12]],
			['name' => 'spoon', 'amount' => ['hidden' => 14, 'found' => 21]],
			['name' => 'spoon', 'amount' => ['hidden' => 6, 'found' => 4]]
		]);
410 411 412 413 414 415 416 417

		$this->assertEquals(65, DB::collection('items')->sum('amount.hidden'));
		$this->assertEquals(4, DB::collection('items')->count('amount.hidden'));
		$this->assertEquals(6, DB::collection('items')->min('amount.hidden'));
		$this->assertEquals(35, DB::collection('items')->max('amount.hidden'));
		$this->assertEquals(16.25, DB::collection('items')->avg('amount.hidden'));
	}

418 419 420 421
	public function testUpsert()
	{
		DB::collection('items')->where('name', 'knife')
							   ->update(
422 423
							   		['amount' => 1],
							   		['upsert' => true]
424 425 426 427 428
							   	);

		$this->assertEquals(1, DB::collection('items')->count());
	}

Jens Segers's avatar
Jens Segers committed
429 430
	public function testUnset()
	{
431 432
		$id1 = DB::collection('users')->insertGetId(['name' => 'John Doe', 'note1' => 'ABC', 'note2' => 'DEF']);
		$id2 = DB::collection('users')->insertGetId(['name' => 'Jane Doe', 'note1' => 'ABC', 'note2' => 'DEF']);
Jens Segers's avatar
Jens Segers committed
433 434 435 436 437 438 439 440 441 442 443

		DB::collection('users')->where('name', 'John Doe')->unset('note1');

		$user1 = DB::collection('users')->find($id1);
		$user2 = DB::collection('users')->find($id2);

		$this->assertFalse(isset($user1['note1']));
		$this->assertTrue(isset($user1['note2']));
		$this->assertTrue(isset($user2['note1']));
		$this->assertTrue(isset($user2['note2']));

444
		DB::collection('users')->where('name', 'Jane Doe')->unset(['note1', 'note2']);
Jens Segers's avatar
Jens Segers committed
445 446 447 448 449 450

		$user2 = DB::collection('users')->find($id2);
		$this->assertFalse(isset($user2['note1']));
		$this->assertFalse(isset($user2['note2']));
	}

451 452
	public function testUpdateSubdocument()
	{
453
		$id = DB::collection('users')->insertGetId(['name' => 'John Doe', 'address' => ['country' => 'Belgium']]);
454

455
		DB::collection('users')->where('_id', $id)->update(['address.country' => 'England']);
456 457 458 459 460 461 462

		$check = DB::collection('users')->find($id);
		$this->assertEquals('England', $check['address']['country']);
	}

	public function testDates()
	{
463 464 465 466 467 468
		DB::collection('users')->insert([
			['name' => 'John Doe', 'birthday' => new MongoDate(strtotime("1980-01-01 00:00:00"))],
			['name' => 'Jane Doe', 'birthday' => new MongoDate(strtotime("1981-01-01 00:00:00"))],
			['name' => 'Robert Roe', 'birthday' => new MongoDate(strtotime("1982-01-01 00:00:00"))],
			['name' => 'Mark Moe', 'birthday' => new MongoDate(strtotime("1983-01-01 00:00:00"))],
		]);
469

470 471
		$user = DB::collection('users')->where('birthday', new MongoDate(strtotime("1980-01-01 00:00:00")))->first();
		$this->assertEquals('John Doe', $user['name']);
472

473 474 475
		$user = DB::collection('users')->where('birthday', '=', new DateTime("1980-01-01 00:00:00"))->first();
		$this->assertEquals('John Doe', $user['name']);

476 477
		$start = new MongoDate(strtotime("1981-01-01 00:00:00"));
		$stop = new MongoDate(strtotime("1982-01-01 00:00:00"));
478

479
		$users = DB::collection('users')->whereBetween('birthday', [$start, $stop])->get();
480
		$this->assertEquals(2, count($users));
481 482
	}

483 484
	public function testOperators()
	{
485 486 487 488 489
		DB::collection('users')->insert([
			['name' => 'John Doe', 'age' => 30],
			['name' => 'Jane Doe'],
			['name' => 'Robert Roe', 'age' => 'thirty-one'],
		]);
490 491 492

		$results = DB::collection('users')->where('age', 'exists', true)->get();
		$this->assertEquals(2, count($results));
493
		$resultsNames = [$results[0]['name'], $results[1]['name']];
494 495
		$this->assertContains('John Doe', $resultsNames);
		$this->assertContains('Robert Roe', $resultsNames);
496 497 498 499 500 501 502 503 504

		$results = DB::collection('users')->where('age', 'exists', false)->get();
		$this->assertEquals(1, count($results));
		$this->assertEquals('Jane Doe', $results[0]['name']);

		$results = DB::collection('users')->where('age', 'type', 2)->get();
		$this->assertEquals(1, count($results));
		$this->assertEquals('Robert Roe', $results[0]['name']);

505
		$results = DB::collection('users')->where('age', 'mod', [15, 0])->get();
506 507 508
		$this->assertEquals(1, count($results));
		$this->assertEquals('John Doe', $results[0]['name']);

509
		$results = DB::collection('users')->where('age', 'mod', [29, 1])->get();
510 511 512
		$this->assertEquals(1, count($results));
		$this->assertEquals('John Doe', $results[0]['name']);

513
		$results = DB::collection('users')->where('age', 'mod', [14, 0])->get();
514 515
		$this->assertEquals(0, count($results));

516 517 518 519 520
		DB::collection('items')->insert([
			['name' => 'fork',  'tags' => ['sharp', 'pointy']],
			['name' => 'spork', 'tags' => ['sharp', 'pointy', 'round', 'bowl']],
			['name' => 'spoon', 'tags' => ['round', 'bowl']],
		]);
521

522
		$results = DB::collection('items')->where('tags', 'all', ['sharp', 'pointy'])->get();
523 524
		$this->assertEquals(2, count($results));

525
		$results = DB::collection('items')->where('tags', 'all', ['sharp', 'round'])->get();
526 527 528 529 530
		$this->assertEquals(1, count($results));

		$results = DB::collection('items')->where('tags', 'size', 2)->get();
		$this->assertEquals(2, count($results));

531 532 533
		$results = DB::collection('items')->where('tags', '$size', 2)->get();
		$this->assertEquals(2, count($results));

534 535 536 537 538
		$results = DB::collection('items')->where('tags', 'size', 3)->get();
		$this->assertEquals(0, count($results));

		$results = DB::collection('items')->where('tags', 'size', 4)->get();
		$this->assertEquals(1, count($results));
Jens Segers's avatar
Jens Segers committed
539 540 541 542

		$regex = new MongoRegex("/.*doe/i");
		$results = DB::collection('users')->where('name', 'regex', $regex)->get();
		$this->assertEquals(2, count($results));
543

544 545 546 547
		$regex = new MongoRegex("/.*doe/i");
		$results = DB::collection('users')->where('name', 'regexp', $regex)->get();
		$this->assertEquals(2, count($results));

548 549
		$results = DB::collection('users')->where('name', 'REGEX', $regex)->get();
		$this->assertEquals(2, count($results));
Jens Segers's avatar
Jens Segers committed
550

551 552 553 554 555 556
		$results = DB::collection('users')->where('name', 'regexp', '/.*doe/i')->get();
		$this->assertEquals(2, count($results));

		$results = DB::collection('users')->where('name', 'not regexp', '/.*doe/i')->get();
		$this->assertEquals(1, count($results));

557 558
		DB::collection('users')->insert([
			[
Jens Segers's avatar
Jens Segers committed
559
				'name' => 'John Doe',
560 561 562 563 564 565
				'addresses' => [
					['city' => 'Ghent'],
					['city' => 'Paris']
				]
			],
			[
Jens Segers's avatar
Jens Segers committed
566
				'name' => 'Jane Doe',
567 568 569 570 571 572 573 574
				'addresses' => [
					['city' => 'Brussels'],
					['city' => 'Paris']
				]
			]
		]);

		$users = DB::collection('users')->where('addresses', 'elemMatch', ['city' => 'Brussels'])->get();
Jens Segers's avatar
Jens Segers committed
575 576
		$this->assertEquals(1, count($users));
		$this->assertEquals('Jane Doe', $users[0]['name']);
577 578
	}

579 580
	public function testIncrement()
	{
581 582 583 584 585 586
		DB::collection('users')->insert([
			['name' => 'John Doe', 'age' => 30, 'note' => 'adult'],
			['name' => 'Jane Doe', 'age' => 10, 'note' => 'minor'],
			['name' => 'Robert Roe', 'age' => null],
			['name' => 'Mark Moe'],
		]);
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606

		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(30, $user['age']);

		DB::collection('users')->where('name', 'John Doe')->increment('age');
		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(31, $user['age']);

		DB::collection('users')->where('name', 'John Doe')->decrement('age');
		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(30, $user['age']);

		DB::collection('users')->where('name', 'John Doe')->increment('age', 5);
		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(35, $user['age']);

		DB::collection('users')->where('name', 'John Doe')->decrement('age', 5);
		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(30, $user['age']);

607
		DB::collection('users')->where('name', 'Jane Doe')->increment('age', 10, ['note' => 'adult']);
608 609 610 611
		$user = DB::collection('users')->where('name', 'Jane Doe')->first();
		$this->assertEquals(20, $user['age']);
		$this->assertEquals('adult', $user['note']);

612
		DB::collection('users')->where('name', 'John Doe')->decrement('age', 20, ['note' => 'minor']);
613 614 615 616 617 618 619 620 621
		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(10, $user['age']);
		$this->assertEquals('minor', $user['note']);

		DB::collection('users')->increment('age');
		$user = DB::collection('users')->where('name', 'John Doe')->first();
		$this->assertEquals(11, $user['age']);
		$user = DB::collection('users')->where('name', 'Jane Doe')->first();
		$this->assertEquals(21, $user['age']);
622 623
		$user = DB::collection('users')->where('name', 'Robert Roe')->first();
		$this->assertEquals(null, $user['age']);
624
		$user = DB::collection('users')->where('name', 'Mark Moe')->first();
625
		$this->assertEquals(1, $user['age']);
626 627
	}

628 629
	public function testProjections()
	{
630 631 632 633 634
		DB::collection('items')->insert([
			['name' => 'fork',  'tags' => ['sharp', 'pointy']],
			['name' => 'spork', 'tags' => ['sharp', 'pointy', 'round', 'bowl']],
			['name' => 'spoon', 'tags' => ['round', 'bowl']],
		]);
635

636
		$results = DB::collection('items')->project(['tags' => ['$slice' => 1]])->get();
637 638 639 640 641 642 643

		foreach ($results as $result)
		{
			$this->assertEquals(1, count($result['tags']));
		}
	}

644
}