【问题标题】:MongoDB aggregate - using $filter with $in condition for projectionMongoDB 聚合 - 使用 $filter 和 $in 条件进行投影
【发布时间】:2018-01-30 18:45:43
【问题描述】:
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'] },
                ]}
        }}
    }}
])

是否可以将 $or 条件替换为单个 $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'] ]}
    }}
}}

])

【问题讨论】:

  • 你的 mongo 版本是什么?这应该在 3.4 中工作。您可以从您的收藏中添加一个示例文档吗?
  • Mongo 版本是 3.2.9。啊,这是3.4 版的新功能。谢谢!

标签: mongodb aggregation-framework


【解决方案1】:

你可以试试:

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

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多