一个查询中有两个 mongodb 个集合
Two mongodb collections in one query
我有大量的客户和大量的客户数据,这些集合是分开的,我不想将它们组合成一个集合(因为其他已经在工作的 servlet),但现在我需要 "Join" 来自两个集合的数据在一个结果中。
因为查询应该return 大量的结果我不想查询服务器一次,然后使用结果再次查询。我还关心服务器和数据库之间的流量以及结果集在服务器RAM中占用的内存。
它现在的工作方式是,我从 'clients' 集合中获取相关的客户列表,并将此列表发送到 'client data' 集合的查询,然后我才得到聚合结果。
我想切断客户端列表的获取和发送,直接返回服务器,让服务器询问自己,让客户端数据收集的查询向客户端集合询问相关的客户端列表。
如何使用存储过程(javascript 函数)在数据库中进行查询,并且 return 仅从集合中获取相关客户端。
或者,有没有办法编写一个查询来连接另一个集合的结果?
How can I use a stored procedure to do the query in the DB and return only the relevant clients out of the collection. Alternatively
Mongodb
中没有程序
Alternatively, Is there a way to write a query that joins result from another collection ?
您通常不需要在 MongoDB 中执行任何联接,而且没有这样的事情。文档的灵活性已经处理了典型的连接需求。您应该考虑您的文档模型,并询问如何从您的模式中设计连接应该始终是您的第一个停靠点。作为替代方案,您可能需要在服务器端使用 aggregation
or Map-Reduce
来处理此问题。
MongoDB 数据建模的关键思想是重写,而不是重读:以读取所需的格式存储数据,不是某种 minimizes/avoids 冗余的格式(即使用非规范化数据模型)。
I don't want to combine them to a single collection
这不是一个很好的论点
I'm also concerned about the traffic between the server and the DB [...]
如果你需要数据,你就需要数据。它的查询方式在这里有何不同?
[...] and the memory that the result set will occupy in the server RAM.
数据量是否太大以至于您想要将其从服务器流式传输到客户端,以便分块传输?我们在谈论多少数据,为什么客户端要读取所有数据?
How can I use a stored procedure to do the query in the DB and return only the relevant clients out of the collection
MongoDB中没有存储过程,但可以使用server-side map/reduce to 'join' collections。通常,存储在数据库中和 运行 的代码违反了层架构分离关注点。我认为这是有史以来最丑陋的黑客攻击之一 - 但这是有争议的。
此外,值得商榷的是,请记住 M/R 在 MongoDB 中有巨大的开销并且不适合实时查询,例如在网络服务器调用中。这些调用将花费数百毫秒。
Is there a way to write a query that joins result from another collection ?
不,操作仅限于单个集合。您可以执行第二个查询并在那里使用 $in
运算符,但是,这类似于子选择并且速度相当快,但当然需要两次往返。
首先,mnemosyn 和 Michael9 是对的。但是如果我处在你的位置,同时假设客户端数据收集是每个客户端一个文档,我会将客户端数据文档的文档 ID 存储在客户端文档中以生成 "join"(仍然没有加入 Mongo) 更容易。
如果每个客户有更多的客户数据文档,那么文档 ID 数组。
但是所有这些并不能使您免于必须在您的应用程序代码中实现 "join",如果它是一个 Rails 应用程序,那么可能在您的控制器中。
"Good news everyone",此聚合查询在 mongo shell 中作为连接查询工作得很好
db.clientData.aggregate([{
$match: {
id: {
$in: db.clients.distinct("_id",
{
"tag": "qa"
})
}
}
},
$group: {
_id: "$computerId",
total_usage: {
$sum: "$workingTime"
}
}
}]);
我有大量的客户和大量的客户数据,这些集合是分开的,我不想将它们组合成一个集合(因为其他已经在工作的 servlet),但现在我需要 "Join" 来自两个集合的数据在一个结果中。
因为查询应该return 大量的结果我不想查询服务器一次,然后使用结果再次查询。我还关心服务器和数据库之间的流量以及结果集在服务器RAM中占用的内存。
它现在的工作方式是,我从 'clients' 集合中获取相关的客户列表,并将此列表发送到 'client data' 集合的查询,然后我才得到聚合结果。
我想切断客户端列表的获取和发送,直接返回服务器,让服务器询问自己,让客户端数据收集的查询向客户端集合询问相关的客户端列表。
如何使用存储过程(javascript 函数)在数据库中进行查询,并且 return 仅从集合中获取相关客户端。 或者,有没有办法编写一个查询来连接另一个集合的结果?
How can I use a stored procedure to do the query in the DB and return only the relevant clients out of the collection. Alternatively
Mongodb
中没有程序Alternatively, Is there a way to write a query that joins result from another collection ?
您通常不需要在 MongoDB 中执行任何联接,而且没有这样的事情。文档的灵活性已经处理了典型的连接需求。您应该考虑您的文档模型,并询问如何从您的模式中设计连接应该始终是您的第一个停靠点。作为替代方案,您可能需要在服务器端使用 aggregation
or Map-Reduce
来处理此问题。
MongoDB 数据建模的关键思想是重写,而不是重读:以读取所需的格式存储数据,不是某种 minimizes/avoids 冗余的格式(即使用非规范化数据模型)。
I don't want to combine them to a single collection
这不是一个很好的论点
I'm also concerned about the traffic between the server and the DB [...]
如果你需要数据,你就需要数据。它的查询方式在这里有何不同?
[...] and the memory that the result set will occupy in the server RAM.
数据量是否太大以至于您想要将其从服务器流式传输到客户端,以便分块传输?我们在谈论多少数据,为什么客户端要读取所有数据?
How can I use a stored procedure to do the query in the DB and return only the relevant clients out of the collection
MongoDB中没有存储过程,但可以使用server-side map/reduce to 'join' collections。通常,存储在数据库中和 运行 的代码违反了层架构分离关注点。我认为这是有史以来最丑陋的黑客攻击之一 - 但这是有争议的。
此外,值得商榷的是,请记住 M/R 在 MongoDB 中有巨大的开销并且不适合实时查询,例如在网络服务器调用中。这些调用将花费数百毫秒。
Is there a way to write a query that joins result from another collection ?
不,操作仅限于单个集合。您可以执行第二个查询并在那里使用 $in
运算符,但是,这类似于子选择并且速度相当快,但当然需要两次往返。
首先,mnemosyn 和 Michael9 是对的。但是如果我处在你的位置,同时假设客户端数据收集是每个客户端一个文档,我会将客户端数据文档的文档 ID 存储在客户端文档中以生成 "join"(仍然没有加入 Mongo) 更容易。
如果每个客户有更多的客户数据文档,那么文档 ID 数组。
但是所有这些并不能使您免于必须在您的应用程序代码中实现 "join",如果它是一个 Rails 应用程序,那么可能在您的控制器中。
"Good news everyone",此聚合查询在 mongo shell 中作为连接查询工作得很好
db.clientData.aggregate([{
$match: {
id: {
$in: db.clients.distinct("_id",
{
"tag": "qa"
})
}
}
},
$group: {
_id: "$computerId",
total_usage: {
$sum: "$workingTime"
}
}
}]);