Mongodb Mongo DB:交叉集合查询(联接样式)

Mongodb Mongo DB:交叉集合查询(联接样式),mongodb,join,Mongodb,Join,我有一个数据库,有两个集合:用户和页面 在我的应用程序中,每个用户可以有0个或多个页面,每个页面属于1个或多个用户 每个用户都有一个pages属性,该属性包含一组对象,这些对象具有页面的id(不是默认的\u id字段,而是一个来自我获取页面数据的社交网络的自定义id)和一些其他页面信息 页面有很多道具,其中一个是是同步的(布尔值) 我想用自己的同步页面查询所有用户(我只需要页面对象的一些属性,比如title) 我在控制台forEaching中尝试了一个javascript函数来查询用户各自的页面

我有一个数据库,有两个集合:用户和页面

在我的应用程序中,每个用户可以有0个或多个页面,每个页面属于1个或多个用户

每个用户都有一个
pages
属性,该属性包含一组对象,这些对象具有页面的
id
(不是默认的
\u id
字段,而是一个来自我获取页面数据的社交网络的自定义
id
)和一些其他页面信息

页面有很多道具,其中一个是
是同步的
(布尔值)

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

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

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

你有什么建议

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

更新

正如建议的那样,我正在添加JSON模型的简化版本

使用者

页面

…以及我用来检索所需管理数据的(粗略)函数

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(';')) 
})

想必您需要使用is_synched boolean来查找索引,这是值得探索的。createIndex({is_synced:1})但您的查询是什么…也许可以添加一个json示例model@GabeRainbow:我添加了一些示例数据和正在使用的函数。我正在考虑在page.facebook\u page\u id上添加索引,而不是在is\u synced上添加索引。。。但对于如何正确使用索引,我一点也不确定
{
    "_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(';')) 
})