我有documents
在games
集合。每个文件都负责保存运行游戏所需的数据。这是我的文档结构
{
_id: 'xxx',
players: [
user:{} // Meteor.users object
hand:[] //array
scores:[]
calls:[]
],
table:[],
status: 'some string'
}
基本上这是我的纸牌游戏(call-bridge)的结构。现在我想要的出版物是,玩家将有他的hand
数据在他的浏览器(minimongo)与其他玩家的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
对象有一个区分用户的_id
属性。在流星发布方法中,我们可以访问this.userId
,它返回请求数据的userId。这意味着我想要那个用户的_id
与this.userId
匹配的嵌套hand
数组。我希望这些解释能帮助你写出更准确的解决方案
您需要做的是使您的集合"正常化"。你所能做的是创建一个单独的集合来保存这些数据,并使用user _id作为"Key",然后只引用players字段中的user _id,而不是在Games集合中的players字段中拥有手牌、分数、呼叫。例如,
创建一个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)
}
要从数组元素中获得特定属性,您可以编写如下行db.games.aggregate([{$unwind:"$players"},{$project:{"players.scores":1}}]);这只给了我们id和scores字段