返回数组元素的特定属性 - MongoDB / Meteor

时间:2016-06-24 12:25:01

标签: mongodb meteor mongodb-query meteor-publications

我在#coupon:hover { border:1px solid #aaa; -webkit-box-shadow: 3px 4px 8px -4px rgba(0,0,0,0.75); -moz-box-shadow: 3px 4px 8px -4px rgba(0,0,0,0.75); box-shadow: 3px 4px 8px -4px rgba(0,0,0,0.75); transition:100ms; cursor:pointer; -webkit-transform: scale(1.02,1.02); -moz-transform: scale(1.02,1.02); transition: 250ms; } 集合中有documents。每个文档都负责保存运行游戏所需的数据。这是我的文档结构

games

基本上这是我的纸牌游戏(call-bridge)的结构。现在我想要的出版物是播放器将在他的浏览器中使用{ _id: 'xxx', players: [ user:{} // Meteor.users object hand:[] //array scores:[] calls:[] ], table:[], status: 'some string' } 数据(minimongo)以及其他播放器hand字段。因此,下载到浏览器的订阅将是这样的。

user, scores, calls

{ _id: 'xxx', players: [ { user:{} // Meteor.users object hand:[] //array scores:[] calls:[] }, { user:{} // Meteor.users object scores:[] calls:[] }, // 2 more player's data, similar to 2nd player's data ], table:[], status: 'some string' } 对象具有players.user属性,用于区分用户。在meteor发布方法中,我们可以访问_id,它返回请求数据的userId。这意味着我想要this.userId与{匹配的用户的嵌套hand数组{1}}。我希望这些解释可以帮助您编写更准确的解决方案。

2 个答案:

答案 0 :(得分:1)

你需要做的是"规范化"你的收藏。不是在游戏集合中的玩家字段中进行手,分数,调用,而是可以创建一个单独的集合来保存该数据,并使用用户_id作为"密钥"然后只引用player字段中的用户_id。例如。

创建GameStats集合(或您想要的任何名称)

    {
_id: '2wiowew',
userId: 1,
hand:[],
scores:[],
calls:[],
}

然后在游戏集合中

{
    _id: 'xxx',
    players: [userId],
    table:[],
    status: 'some string'


}

因此,如果您想获取当前用户请求数据的内容

GameStats.find({userId: this.userId}).hand

修改

他们确实鼓励在某些情况下进行非规范化,但在上面发布的代码中,数组不起作用。以下是mongoDB文档中的示例。

{
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}

答案 1 :(得分:0)

要从数组元素中获取特定属性,您可以编写一些内容,如下面的行db.games.aggregate([{$ unwind:“$ players”},{$ project:{“players.scores”:1 }}]);这只给我们id和得分字段