2015-02-10 3 views
0

Если есть данные, как это:MongoDB: агрегирование - группа состояние, если не пустой

{ 
user: "max", 
uploaded: <timestamp>, 
updated: <timestamp> 
} 
{ 
user: "tim", 
uploaded: <timestamp> 
} 

Ever пользователь может иметь различные элементы. Сейчас я использую структуру агрегации MongoDB с $ матча + $ группы, как это:

aggregate([ 
{ $match: {"username": "foouser"}}, 
{ $group: { 
    ...other items.. 
    "last_active": max(updated) OR IF EMPTY max(uploaded) 
} 
]); 

Я хочу, чтобы установить «last_active» к максимальной временной метке обновляется, чтобы получить последний активный из пользователя по всем его пунктам. Но не каждый элемент имеет свойство update-property. Возможно, есть свойство update-property в любом элементе пользователя. Поэтому, если max (обновлено) пуст, он должен выбрать max (загружен).

Может ли кто-нибудь помочь мне с этим условием в групповом порядке?

ответ

1

Конвейер агрегации сильно изменился с версии на версию, поэтому рекомендуется использовать последнюю стабильную версию mongodb.

Попробуйте совместить $ макс и $ setUnion операторы, например:

db.Collection.aggregate([ 
    { $match: {"username": "foouser"}}, 
    { $group: { 
    ...other items.. 
    "last_active": { $max: { $setUnion: [ "$updated", "$uploaded" ] } } 
    } 
]); 

Или $ IFNULL и $ макс:

db.Collection.aggregate([ 
    { $match: {"username": "foouser"}}, 
    { $group: { 
    ...other items.. 
    "last_active": { $max: { $ifNull: [ "$updated", "$uploaded" ] } } 
    } 
]); 
+0

Спасибо! $ setUnion не поддерживается в моей версии mongo-db, но он отлично работает с $ ifNull! – mdunisch

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