如何投影单个数组字段

时间:2018-01-16 12:43:12

标签: mongodb aggregation-framework mongodb-.net-driver

从此文档架构开始

{ 
    "_id" : ObjectId("5a5cfde58c8a4a35a89726b4"), 
    "Names" : [ 
                { "Code" : "en", "Name" : "ITALY" }, 
                { "Code" : "it", "Name" : "ITALIA" } 
              ],
    "TenantID" : ObjectId("5a5cfde58c8a4a35a89726b2"),
    ...extra irrelevant fields
}

我需要得到一个像这样的对象

{ 
    "ID" : ObjectId("5a5cfde58c8a4a35a89726b4"), 
    "Name" : "ITALY"
}

按数组的代码字段过滤(在样本中按'en')。

我写了一个聚合查询,这个

db.Countries.aggregate([{$project: {_id:0, 'ID': '$_id', 'Names': {$filter: {input: '$Names', as: 'item', cond: {$eq: ['$$item.Code', 'en']}}}}},{$skip: 10},{$limit: 5}]);

只能正确返回带有'en'Names值的文档,只返回子数组匹配元素。

enter image description here

现在我找不到将Name字段值返回到新的“Name”字段的方法。 哪种方法最好,性能最好?

其实我正在尝试使用Mongo shell,但后来我需要用.NET驱动程序复制这种行为。

使用MongoDB 3.6

由于

1 个答案:

答案 0 :(得分:0)

您可以尝试以下聚合查询。

$match仅考虑数组中至少有一个元素匹配输入条件的文档。

输入条件上的

$filter数组和投放单个匹配元素的$arrayElemAt

$let从匹配对象输出名称。

db.Countries.aggregate([
  {"$match":{"Names.Code":"en"}},
  {"$project":{
    "_id":0, 
    "ID": "$_id",
    "Name":{
      "$let":{
        "vars":{
          "obj":{
            "$arrayElemAt":[
              {"$filter":{
                "input":"$Names",
                "as":"name",
                "cond":{"$eq":["$$name.Code","en"]}
              }},
              0]
          }
        },
        "in":"$$obj.Name"
      }
    }
  }},
 {"$skip": 10},
 {"$limit": 5}
])