如何获取在另一个集合中引用的MongoDB文档列表

时间:2015-02-19 15:38:29

标签: mongodb doctrine-orm mapreduce doctrine-odm

我正在尝试找到一种方法来获取在另一个集合的子文档中引用的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可以解决这个问题,但我不太清楚我应该在那里使用哪些字段。

这里有专家吗?

1 个答案:

答案 0 :(得分:0)

经过对MongoDB IRC频道的更多研究和聊天后,有几种方法可以让它发挥作用:

  1. 使用$in查询。
  2. 跟踪双方的关系(稍微更难以保持双方的关系,但它确实有效)。
  3. 更改关系的拥有方(跟踪用户文档中的业务),但这取决于查询的性质。
  4. Aggregation Framework不起作用,因为它无法查询多个集合,也不会MapReduce(出于同样的原因,虽然it is possible)。