Skip to content

Commit 9f60163

Browse files
committed
Add unique parameter for push, fixes #91
1 parent 379fcba commit 9f60163

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,10 @@ Add an items to an array.
422422
DB::collection('users')->where('name', 'John')->push('items', 'boots');
423423
DB::collection('users')->where('name', 'John')->push('messages', array('from' => 'Jane Doe', 'message' => 'Hi John'));
424424

425+
If you don't want duplicate items, set the third parameter to `true`:
426+
427+
DB::collection('users')->where('name', 'John')->push('items', 'boots', true);
428+
425429
**Pull**
426430

427431
Remove an item from an array.

src/Jenssegers/Mongodb/Query/Builder.php

+6-3
Original file line numberDiff line numberDiff line change
@@ -522,15 +522,18 @@ public function raw($expression = null)
522522
* @param mixed $value
523523
* @return int
524524
*/
525-
public function push($column, $value = null)
525+
public function push($column, $value = null, $unique = false)
526526
{
527+
// Use the addToSet operator in case we only want unique items.
528+
$operator = $unique ? '$addToSet' : '$push';
529+
527530
if (is_array($column))
528531
{
529-
$query = array('$push' => $column);
532+
$query = array($operator => $column);
530533
}
531534
else
532535
{
533-
$query = array('$push' => array($column => $value));
536+
$query = array($operator => array($column => $value));
534537
}
535538

536539
return $this->performUpdate($query);

tests/QueryBuilderTest.php

+10-3
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,22 @@ public function testPush()
217217
$this->assertEquals('tag1', $user['tags'][0]);
218218

219219
DB::collection('users')->where('_id', $id)->push('tags', 'tag2');
220-
221220
$user = DB::collection('users')->find($id);
222-
$this->assertTrue(is_array($user['tags']));
223221
$this->assertEquals(2, count($user['tags']));
224222
$this->assertEquals('tag2', $user['tags'][1]);
225223

224+
// Add duplicate
225+
DB::collection('users')->where('_id', $id)->push('tags', 'tag2');
226+
$user = DB::collection('users')->find($id);
227+
$this->assertEquals(3, count($user['tags']));
228+
229+
// Add unique
230+
DB::collection('users')->where('_id', $id)->push('tags', 'tag1', true);
231+
$user = DB::collection('users')->find($id);
232+
$this->assertEquals(3, count($user['tags']));
233+
226234
$message = array('from' => 'Jane', 'body' => 'Hi John');
227235
DB::collection('users')->where('_id', $id)->push('messages', $message);
228-
229236
$user = DB::collection('users')->find($id);
230237
$this->assertTrue(is_array($user['messages']));
231238
$this->assertEquals($message, $user['messages'][0]);

0 commit comments

Comments
 (0)