MongoDB聚合 - 使用$ filter和$ in条件进行投影

时间:2018-01-30 18:45:43

标签: mongodb aggregation-framework

db.getCollection('regions').aggregate([
    { $match: { 'status': 1 },
    { $project: {
        names: { $filter: {
            input: '$names',
            as: 'name',
            cond: {$or: [
                { $eq: ['$$name.lang', 'de'] },
                { $eq: ['$$name.lang', 'en'] },
                { $eq: ['$$name.lang', 'es'] },
                ]}
        }}
    }}
])

是否可以将$或条件替换为单个$ in:[' de',' en',' es']条件?

这不起作用:

db.getCollection('regions').aggregate([
{ $match: { 'osm.parent': 0, 'osm.admin_level': 2 }},
{ $project: {
    osm: 1,
    names: { $filter: {
        input: '$names',
        as: 'name',
        cond: { $in: [ '$$name.lang', ['de','en','es'] ]}
    }}
}}

])

1 个答案:

答案 0 :(得分:0)

你可以尝试:

{ $unwind : "$name" }
{ $match : { "$name.lang" : { "$in" : [ "de", "en", "es"] } }}

而不是在投影中使用$filter

db.getCollection('regions').aggregate([
    { $match: { 'osm.parent': 0, 'osm.admin_level': 2 } },
    { $unwind : "$name" },
    { $match : { "$name.lang" : { "$in" : [ "de", "en", "es"] } } },
    { $project: { osm: 1, "name.lang": 1 } }
])