4

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

    {
    "_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"
           }
    }

我怎么能得到那个?

4

1 回答 1

4

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

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

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

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
于 2016-09-19T18:58:34.627 回答