我正在尝试找到一种方法来获取在另一个集合的子文档中引用的MongoDB文档列表。
我有一个包含用户文档的集合。在另一个集合中,我保留了一份业务清单。每个企业都有一个子文档,其中包含对用户的引用列表。
用户集合:
/* user-1 */
{
"_id" : ObjectId("54e5e78680c7e191218b49b0"),
"username" : "jachim@example.com",
"password" "$2y$13$21p6hx3sd200cko4o0w04u46jNv3tNl3qpVWVbnAyzZpDxsSVDDLS"
}
/* user-2 */
{
"_id" : ObjectId("54e5e78480c7e191218b49ab"),
"username" : "jachim@example.net",
"password" : "$2y$13$727amk1a7fwo4sgw8kkkcuWi4vhj2zKvZZIEDWtDQLo6dUjb0YnYy",
}
商家系列
/* business-1 */
{
"_id" : ObjectId("54e5e78880c7e191218b4c52"),
"name" : "Stack Overflow",
"users" : [
{
"$ref" : "User",
"$id" : ObjectId("54e5e78680c7e191218b49b0"),
"$db" : "test"
}
]
}
我可以通过关注business.users列表中的引用来获取业务用户,我可以通过db.Business.find({"users.$id": ObjectId("54e5e78480c7e191218b49ab")})
查询从用户那里获得业务,但是我无法创建查询来查找在业务中某处引用的所有用户。
我可以通过两个步骤完成此客户端:
db.Business.distinct("users.$id");
将返回用户ID列表。我可以在查询用户集合时使用此列表:
db.User.find({ _id: { $in: [ LIST_OF_IDS ] } });
但这可能导致非常大的查询(可能导致查询大于16MB)。
我认为MapReduce可以解决这个问题,但我不太清楚我应该在那里使用哪些字段。
这里有专家吗?
答案 0 :(得分:0)
经过对MongoDB IRC频道的更多研究和聊天后,有几种方法可以让它发挥作用:
$in
查询。Aggregation Framework不起作用,因为它无法查询多个集合,也不会MapReduce(出于同样的原因,虽然it is possible)。