2013-10-14 3 views
3

Скажем, у меня есть коллекция с документами, которые выглядят так:Сортировать по совпадениям поддокументе

{ 
    "_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") 
    }] 
} 

Теперь предположим, что я запрашивая документ, который имеет «пользователи» поддокумент, содержащий конкретную USERID, который ISN «т удален - так, запрос выглядит как:

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

будет ли можно затем сортировать возвращаемый ResultSet атрибутом согласованного поддокументе в строке updatedAt? Если нет, есть ли более подходящий способ настройки этого? Должен ли я просто создать еще одну коллекцию того, что я сейчас вложил в ключ users, а затем иметь ссылку на родительский документ?

ответ

1

Да, это возможно. Вы можете попробовать:

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

Здесь 'collection' следует заменить на название вашей коллекции.

+0

Если у меня есть индекс, определяемый как: '{" users.userId ": 1," users.deleted ": 1," users.updatedAt ": -1}', будет ли этот индекс охватывать этот запрос? Это будет обычно запускаться, поэтому, если у вас есть смысл вывести его в отдельный сбор по соображениям производительности, я бы предпочел сделать это. –

+0

@ColinMorelli да, это все равно будет работать. – Jhanvi

+0

@ColinMorelli, но вы все равно можете проверить его, чтобы быть уверенным. – Jhanvi

Смежные вопросы