我有一个包含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(';'))
})