我们说我有以下MongoDB文档。
{
(...)
"services": {
"TCP80": {
"data": [{
"status": 1,
"delay": 3.87,
"ts": 1308056460
},{
"status": 1,
"delay": 2.83,
"ts": 1308058080
},{
"status": 1,
"delay": 5.77,
"ts": 1308060720
}]
}
}}
我希望检索"数据"中的所有条目。其中" ts"值大于" 1308056460"。因此,预期结果将是,
[
{
"status": 1,
"delay": 2.83,
"ts": 1308058080
},{
"status": 1,
"delay": 5.77,
"ts": 1308060720
}
]
执行此操作的一种方法是使用MongoDB聚合函数。
db.test.aggregate(
{$match : {}},
{$unwind: "$services.TCP80.data"},
{$match: {"services.TCP80.data.ts": {$gte: 1308060720}}}
);
另一个是通过中间层(node.js应用程序)检索整个数据数组并运行循环来过滤掉我想要的值。
不考虑实现简单性,哪种方法更有效或产生更快的结果?为什么?
答案 0 :(得分:4)
一般来说,MongoDB Aggregate函数预计会更快,因为它是用C实现的,并且经过高度优化,并且不断开发以更快地运行。
话虽如此,即使事实并非如此,正如Neil所提到的,除非你正在构建关键任务,否则优秀的软件工程实践应该优先考虑。数据库应该完成所有繁重的工作,并且应该避免不必要的数据传输。代码复杂性和抽象也应该考虑在内。在这种情况下,由于MongoDb确实提供了一个查询来复制数据库本身的逻辑,你应该在数据库服务器上做这件事。