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



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

{
    _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。这意味着我想要那个用户的_idthis.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字段

相关内容

  • 没有找到相关文章

最新更新