从此文档架构开始
{
"_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值的文档,只返回子数组匹配元素。
现在我找不到将Name字段值返回到新的“Name”字段的方法。 哪种方法最好,性能最好?
其实我正在尝试使用Mongo shell,但后来我需要用.NET驱动程序复制这种行为。
使用MongoDB 3.6
由于
答案 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}
])