2013-10-14 3 views
3

Assorti Dire que j'ai une collection avec des documents qui ressemblent à ceci:Trier par Subdocument

{ 
    "_id": ObjectId("507f191e810c19729de860ea"), 
    "users": [{ 
     "userId": ObjectId("507f1f77bcf86cd799439011"), 
     "deleted": false, 
     "updatedAt" ISODate("2013-10-17T20:46:22Z") 
    }, { 
     "userId": ObjectId("507f1f71baf40ea8438490fa"), 
     "deleted": false, 
     "updatedAt" ISODate("2013-10-17T22:19:10Z") 
    }] 
} 

Maintenant, supposons que j'Interrogation un document qui a un « utilisateur » sous-document contenant une userId spécifique, qui ISN « t supprimé - donc, une requête ressemblant à:

{"users.userId": ObjectId("507f1f77bcf86cd799439011"), "users.deleted": false} 

Serait-il possible de trier puis retourné par l'resultset attribut updatedAt de la sous-document adapté à la ligne? Si ce n'est pas le cas, y a-t-il une façon plus appropriée de mettre cela en place? Devrais-je simplement créer une autre collection de ce que j'ai actuellement incorporé dans la clé users, puis avoir cette référence le document parent?

Répondre

1

Oui, c'est possible. Vous pouvez essayer ceci:

db.collection.aggregate([ 
{$unwind:"$users"}, 
{$match:{"users.userId":"ObjectId("507f1f77bcf86cd799439011")","users.deleted":false}}, 
{$sort:{"users.updatedAt":1}}]) 

Ici, 'collection' doit être remplacé par le nom de votre collection.

+0

Si j'ai un index défini comme: '{" users.userId ": 1," users.deleted ": 1," users.updatedAt ": -1}', cet index couvre-t-il cette requête? Cela serait courant, donc s'il est plus logique d'en faire une collection séparée pour des raisons de performance, je préférerais le faire. –

+0

@ColinMorelli oui cela fonctionnera toujours. – Jhanvi

+0

@ColinMorelli mais vous pouvez toujours le tester, pour être sûr. – Jhanvi