2015-04-14 2 views
1

У меня есть коллекция MongoDB со структурой типа, что:MongoDB агрегат - фильтр поддокументе

[ 
    { 
    name: "name1", 
    instances: [{value:1, score:2}, {value:2, score:5}, {value:2.5, score:9}] 
    }, 
    { 
    name: "name2", 
    instances: [{value:6, score:3}, {value:1, score:6}, {value:3.7, score:5.2}] 
    } 
] 

Когда я хочу, чтобы получить все данные из документа, я использую aggregate, потому что я хочу, чтобы каждый экземпляр возвращается как отдельные документ:

db.myCollection.aggregate([{$match:{name:"name1"}}, {$unwind:"$instances"}, {$project:{name:1, value:"$instances.value", score:"$instances.score"}}]) 

И все работает так, как я хочу.

Теперь на мой вопрос: я хочу отфильтровать возвращаемые данные по количеству баллов или по значению. Например, мне нужен массив всех поддокументов name1, у которых значение больше или равно 2. Я попытался добавить к объекту $match'instances.value':{$gte:2}, но он ничего не фильтровал, и я все еще получаю все 3 документа для этого запроса.

Любые идеи?

+0

Помогите мне понять вашу проблему, у вас есть образец ожидаемый результат? – chridam

+1

@chridam, ожидаемый результат: '[{name:" name1 ", value: 2, score: 5}, {name:" name1 ", value: 2.5, score: 9}]' – yarons

+1

Cheers, я считаю, что @yogesh получил это правильно. – chridam

ответ

2

После раскручивания instances затем снова используется $match, как показано ниже

db.collectionName.aggregate({ 
    "$match": { 
    "name": "name1" 
    } 
}, { 
    "$unwind": "$instances" 
}, { 
    "$match": { 
    "instances.value": { 
     "$gte": 2 
    } 
    } 
}, { 
    $project: { 
    name: 1, 
    value: "$instances.value", 
    score: "$instances.score" 
    } 
}) 

Или, если вы пробовали $match после project затем используется как ниже

db.collectionName.aggregate([{ 
    $match: { 
    name: "name1" 
    } 
}, { 
    $unwind: "$instances" 
}, { 
    $project: { 
    name: 1, 
    value: "$instances.value", 
    score: "$instances.score" 
    } 
}, { 
    "$match": { 
    "value": { 
     "$gte": 2 
    } 
    } 
}]) 
+0

Спасибо. Оно работает. – yarons

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