Mongo DB:交叉集合查询(join style)

时间:2015-06-13 14:46:20

标签: mongodb join

我有一个包含2个集合的数据库:用户页面

在我的应用中,每个用户可以有0个或更多,每个属于1个或更多个用户

每个用户都有一个pages属性,其中包含id的对象数组(不是默认的_id字段,而是来自社交网络的自定义id “正在从页面中获取页面数据”和其他一些页面信息。

页面有很多道具,其中一个是is_synced(布尔值)。

我想查询具有自己同步页面的所有用户(我只想要一些页面对象的属性,比如title)。

我在控制台forEach中尝试了一个javascript函数来查询各自的页面,但需要一辈子才能完成。

我的集合上没有索引,除了_id字段中的默认值(不知道如何设置/使用它们)。

您会建议采用什么方法?

我应该在页面自定义id字段上创建索引吗?我是否应该在用户集合中保存所需的页面属性,即使应用程序逻辑不需要它们,但仅用于管理目的?我应该执行某种形式的聚合(map / reduce或类似)吗?

更新

正如所建议我添加了JSON模型的简化版......

用户

{
    "_id" : ObjectId("555bd93562ed89ff43d792ce"),
    "facebook_data" : {
        profile: {
            id: "98765456789",
            displayName: "Some Name"
        },
        ...
        "pages" : [ 
            {
                "id" : "12345678909876",
                "title" : "My Awesome Page",
                ...
                "is_published" : true
            },
            ...
        ],
        ...
    },
    "ready" : true
}

{
    "_id" : ObjectId("556632b1cb44ccc10c59b82b"),
    "facebook_page_id" : "12345678909876",
    ...
    "is_synced" : true,
    ...
    "facebook_page_data" : {
        "id" : "12345678909876",
        "title" : "My Awesome Page",
        ...
    },
    ...
}

...以及我用来检索我需要的管理数据的(粗略)功能......

db.users.find().forEach(function(user){ 
    var pages = []
    if(user.facebook_data.pages && user.facebook_data.pages.length) {
        var page_ids = user.facebook_data.pages.map(function (page) {
            return page.id
        })
        pages = db.pages.find({'facebook_page_id': {$in:page_ids}, 'is_synced': true})
        .map(function (page) {
            return page.facebook_page_data.title
        })
    }
    print([ user.facebook_data.profile.displayName || '', user.facebook_data.profile.id, pages.join(',') ].join(';')) 
})

0 个答案:

没有答案