Meteor:访问嵌套对象中的一个属性

时间:2016-01-31 17:28:35

标签: mongodb meteor

我有这个MongoDB查询返回一个对象(文档)

var myFavSports = Profile.findOne({userId: currentUser, 'favsports.name': league});

这是我登录到控制台的内容:

Object {_id: "sxberS7dGh3jwkann", userId: "59Pfb4MZy9WyAqqxc", userLevel: "Level 1", userLevelDescription: "Free Level", userLevelExpiration: Thu Jan 01 2099 00:00:00 GMT-0500 (EST)…}
_id: "sxberS7dGh3jwkann"
aboutMe: "Description not provided"
avatarImage: "http://meteor.com/images/avatarplaceholder.png"
favsports: Array[3]
0: Object
name: "GER Bund"
selfrank: "3"
__proto__: Object
1: Object
name: "NBA"
selfrank: "2"
__proto__: Object
2: Object
name: "NHL"
selfrank: "1"

所以,如果我向这个模板助手提供“GER Bund”,它应该返回3(selfrank)

相反,它返回整个文档,在userID和联盟上匹配,但如何从中获取“3”以显示在模板中。

我试过.notation,它总是返回“undefined”。我尝试打印到控制台作为myFavSports.favsports [0] .rank,然后它工作,但它不是正确的匹配,因为硬编码索引0不匹配。

1 个答案:

答案 0 :(得分:1)

由于Minimongo尚未支持 positional $ 中的 field specifiers 运算符,因此解决方法是使用 {{返回数组上的3}} 方法来过滤元素:

   var query = { "userId": currentUser, "favsports.name": league };
   var myFavSports = Profile.findOne(query).favsports
                            .filter(function(s) { 
                                return s.name === league 
                            })[0] ;

console.log(myFavSports); // logs { name: "GER Bund", selfrank: "3"}
console.log(myFavSports.name); // logs "GER Bund"
console.log(myFavSports.selfrank); // logs "3"

在mongo shell中,您可以在投影中使用 filter() 运算符,因为这会自动将favsports数组的内容从查询结果中限制为仅包含第一个与查询文档匹配的元素。因此,您可以按如下方式获得所需的对象:

var query = { "userId": currentUser, "favsports.name": league },
    projection = { "_id": 0, "favsports.$": 1 },
    myFavSports = db.profile.findOne(query, projection).favsports[0];

console.log(myFavSports); // logs { name: "GER Bund", selfrank: "3"}
console.log(myFavSports.name); // logs "GER Bund"
console.log(myFavSports.selfrank); // logs "3"