【问题标题】:Mongoose extract first subarray element after filteringMongoose在过滤后提取第一个子数组元素
【发布时间】:2017-01-27 13:20:24
【问题描述】:

我在子文档中有这样的数组

    {
    "_id" : ObjectId("512e28984815cbfcb21646a7"),
    "descDay" : [
        {
            "language" : "en",
            "desc": "day description"
        },
        {
            "language" : "es",
            "desc": "descripcion del dia"
        }
    ]
}

我想按语言过滤子文档。我可以这样做

db.test.aggregate([
    { $project: {
        descDay: {$filter: {
            input: '$list',
            as: 'item',
            cond: {$gt: ['$$item.language', 'en']}
        }}
    }}
])

这会给我类似的东西

{
  "_id" : ObjectId("512e28984815cbfcb21646a7"),
   "descDay" : [
      {
        "language" : "en",
        "desc": "day description"
       }]
}

但我需要 descDay 是一个文档而不是一个数组,像这样:

   {
      "_id" : ObjectId("512e28984815cbfcb21646a7"),
       "descDay" : 
          {
            "language" : "en",
            "desc": "day description"
           }
    }

我怎样才能得到它?

【问题讨论】:

    标签: node.js mongodb mongodb-query aggregation-framework mongodb-aggregation


    【解决方案1】:

    您可以使用$unwind 将单元素descDay 数组展开为一个对象:

    db.test.aggregate([
        { $project: {
            descDay: {$filter: {
                input: '$descDay',
                as: 'item',
                cond: {$eq: ['$$item.language', 'en']}
            }}
        }},
        { $unwind: '$descDay' }
    ])
    

    或者,正如@chridam 提到的,您可以在$project 中使用$arrayElemAt 并直接投影第一个元素:

    db.test.aggregate([
        { $project: {descDay: {$arrayElemAt: [
            {$filter: {
                input: '$descDay',
                as: 'item',
                cond: {$eq: ['$$item.language', 'en']}
            }}, 0]
        }}}
    ])
    

    无论哪种方式,输出都是:

    { 
        "_id" : ObjectId("512e28984815cbfcb21646a7"), 
        "descDay" : {
            "language" : "en", 
            "desc" : "day description"
        }
    }
    

    请注意,我必须解决您原始查询中的几个问题:

    1. '$list''$descDay'
    2. $gt$eq

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2021-12-21
      • 2021-05-04
      • 2018-03-07
      相关资源
      最近更新 更多