0

我收藏documentsgames。每个文档都负责保存运行游戏所需的数据。这是我的文档结构

{
    _id: 'xxx',
    players: [
            user:{} // Meteor.users object
            hand:[] //array
            scores:[]
            calls:[]
        ],
    table:[],
    status: 'some string'


}

基本上这是我的纸牌游戏(呼叫桥)的结构。现在我想要发布的是玩家将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区分用户的属性。在meteor publish方法中,我们可以访问this.userId返回请求数据的userId。这意味着我想要匹配hand的那个用户的嵌套数组。我希望这些解释可以帮助您编写更准确的解决方案。_idthis.userId

4

2 回答 2

1

您需要做的是“规范化”您的收藏。您可以做的是创建一个单独的集合来保存该数据并使用用户_id作为“键”,然后只在玩家字段中引用用户_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)
}
于 2016-06-24T14:14:30.563 回答
0

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

于 2016-06-24T12:36:00.220 回答