@@ -1723,6 +1723,22 @@ public function testSchemalessNestedObjectAttributeQueries(): void
17231723 ],
17241724 ],
17251725 ],
1726+ 'sessions ' => [
1727+ [
1728+ 'device ' => [
1729+ 'os ' => 'ios ' ,
1730+ 'version ' => '17 ' ,
1731+ ],
1732+ 'active ' => true ,
1733+ ],
1734+ [
1735+ 'device ' => [
1736+ 'os ' => 'android ' ,
1737+ 'version ' => '14 ' ,
1738+ ],
1739+ 'active ' => false ,
1740+ ],
1741+ ],
17261742 ]));
17271743
17281744 $ database ->createDocument ($ col , new Document ([
@@ -1739,6 +1755,15 @@ public function testSchemalessNestedObjectAttributeQueries(): void
17391755 ],
17401756 ],
17411757 ],
1758+ 'sessions ' => [
1759+ [
1760+ 'device ' => [
1761+ 'os ' => 'android ' ,
1762+ 'version ' => '15 ' ,
1763+ ],
1764+ 'active ' => true ,
1765+ ],
1766+ ],
17421767 ]));
17431768
17441769 // Document without full nesting
@@ -1751,6 +1776,7 @@ public function testSchemalessNestedObjectAttributeQueries(): void
17511776 'country ' => 'US ' ,
17521777 ],
17531778 ],
1779+ 'sessions ' => [],
17541780 ]));
17551781
17561782 // Query using Mongo-style dotted paths: attribute.key.key
@@ -1809,6 +1835,34 @@ public function testSchemalessNestedObjectAttributeQueries(): void
18091835 $ this ->assertContains ('u1 ' , $ idsEqual );
18101836 $ this ->assertContains ('u3 ' , $ idsEqual );
18111837
1838+ // elemMatch on array of nested objects (sessions.device.os, sessions.active)
1839+ $ iosActive = $ database ->find ($ col , [
1840+ Query::elemMatch ('sessions ' , [
1841+ Query::equal ('device.os ' , ['ios ' ]),
1842+ Query::equal ('active ' , [true ]),
1843+ ]),
1844+ ]);
1845+ $ this ->assertCount (1 , $ iosActive );
1846+ $ this ->assertEquals ('u1 ' , $ iosActive [0 ]->getId ());
1847+
1848+ // elemMatch where nested condition only matches u2 (android & active)
1849+ $ androidActive = $ database ->find ($ col , [
1850+ Query::elemMatch ('sessions ' , [
1851+ Query::equal ('device.os ' , ['android ' ]),
1852+ Query::equal ('active ' , [true ]),
1853+ ]),
1854+ ]);
1855+ $ this ->assertCount (1 , $ androidActive );
1856+ $ this ->assertEquals ('u2 ' , $ androidActive [0 ]->getId ());
1857+
1858+ // elemMatch with condition that should not match any document
1859+ $ windowsSessions = $ database ->find ($ col , [
1860+ Query::elemMatch ('sessions ' , [
1861+ Query::equal ('device.os ' , ['windows ' ]),
1862+ ]),
1863+ ]);
1864+ $ this ->assertCount (0 , $ windowsSessions );
1865+
18121866 $ database ->deleteCollection ($ col );
18131867 }
18141868}
0 commit comments