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



我正试图找到一种方法来获取在另一个集合的子文档中引用的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将是一个解决方案,但我不太确定我应该在那里使用什么字段。

这里有专家吗?

在MongoDB IRC频道上进行了更多的研究和聊天后,有几个选项可以让它发挥作用:

  1. 转到$in查询
  2. 跟踪双方的关系(让双方的关系保持最新有点困难,但这是有效的)
  3. 更改关系的拥有方(在用户文档中跟踪业务),但这取决于查询的性质

聚合框架将不起作用,因为它不能查询多个集合,MapReduce也不能(出于同样的原因,尽管这是可能的)。

相关内容

  • 没有找到相关文章

最新更新