Mongodb 如何获取Meteor中阵列交点的反应数据?

Mongodb 如何获取Meteor中阵列交点的反应数据?,mongodb,meteor,Mongodb,Meteor,假设我有一个用户集合,每个用户都有一个包含他喜欢的页面的数组(想象一下facebook页面ID): 当前用户: { 姓名:“我”, 喜欢:[123234777] } 目标列表: { 姓名:“简”, 喜欢:[111222333] }, { 姓名:“玛丽”, 喜欢:[567234777654] }, { 姓名:“约翰”, 喜欢:[123234567890777] }, { 姓名:“史蒂夫”, 喜欢:[666777321432543] }, 结果: { 姓名:“约翰”, 喜欢:[123234777

假设我有一个用户集合,每个用户都有一个包含他喜欢的页面的数组(想象一下facebook页面ID):

当前用户:

{
姓名:“我”,
喜欢:[123234777]
}
目标列表:

{
姓名:“简”,
喜欢:[111222333]
},
{
姓名:“玛丽”,
喜欢:[567234777654]
},
{
姓名:“约翰”,
喜欢:[123234567890777]
},
{
姓名:“史蒂夫”,
喜欢:[666777321432543]
},
结果:

{
姓名:“约翰”,
喜欢:[123234777]
},
{
姓名:“玛丽”,
喜欢:[234777]
},
{
姓名:“史蒂夫”,
喜欢:[777]
},
{
姓名:“简”,
喜欢:[]
},

我想得到一个由我最喜欢的用户订购的用户的反应式发布。我需要它的反应,因为每个用户都有用户存在-在线/离线。具有likes id的数组是静态的,但用户状态会随着时间的推移而变化。

我将把发布/订阅和反应部分留给您,但不必在代码中迭代结果的情况下执行集合交集的一般机制可以使用聚合框架来实现

值得注意的是,这只是一个服务器端函数,您需要获取对底层“节点本机驱动程序”的引用,以便当前调用该方法:

var db=MongoInternals.defaultRemoteCollectionDriver().mongo.db;
事实上,对于MongoDB 2.6及更高版本,有一个运营商可以简化这一过程:

db.targets.aggregate([
//你可能想要一个$match来先找到“朋友”
{“$match”:{“\u id”:{“$in”:[friends]}},
//投影集合交点
{“$project”:{
“名称”:1,
“喜欢”:{
“$setIntersection”:[“$likes”,[123234777]]
}
}}
])
对于2.6之前的MongoDB版本,基本上还是可以的,您只需要手动完成操作员允许的所有工作:

db.targets.aggregate([
//你可能想要一个$match来先找到“朋友”
{“$match”:{“\u id”:{“$in”:[friends]}},
//使用匹配的值投影数组
{“$project”:{
“名称”:1,
“喜欢”:1,
“mylikes”:{“$cond”:[1[123234777],0]}
}},
//展开两个阵列
{“$REWIND”:“$likes”},
{“$unwind”:“$mylikes”},
//找出那些喜欢的地方是一样的。交叉点。
{“$project”:{
“名称”:1,
“喜欢”:1,
“匹配”:{“$eq”:[“$likes”,“$mylikes”]}
}},
//筛选不匹配的结果
{“$match”:{“match”:true},
//把喜欢的人排在后面
{“$组”:{
“\u id”:“$\u id”,
“名称”:{“$first”:“$name”},
“likes”:{“$push”:“$likes”}
}}
])
最后一个删除了“Jane”的条目,因为没有匹配的like,但或多或少是期望的结果

如果您对此感兴趣,那么您应该更详细地了解使用aggregate with meteor的哪些封面。但是通用方法就在这里,它应该提供比在客户端处理结果更快捷、更优雅的解决方案,以便找到集合的交集。

看看反应联接。