我对MEAN堆栈/节点相对较新,我试图做一个我在.Net / RDBMS世界中很容易找到的操作:
SELECT * FROM Collection1 WHERE Id IN
(SELECT Collection1Id FROM Collection2 WHERE SomeValue > @Something
AND SomeOtherValue <@Something)
现在在Mongo中,我无法访问加入,并且对象自然不同,嵌入也没有意义。所以到目前为止我所拥有的是:
Collection1.find({ ..filtering criteria here ...}, function(err, collection1s){
var idsFromCollection1 =[];
//forEach is bad because it's blocking?
collection1s.forEach(function(item){
idsFromCollection1.push(item.doc._id);
});
//nested callbacks are not ideal but unsure what else to do?
Collection2.find({ "collection1Id" : { $in: idsFromCollection1 },
{ SomeValue : { $gt: something }},
{ SomeOtherValue { $lt: something }} },
function(err, collection2s){
//do some sort of filter on collection1s where id must be in collection2s
});
});
这似乎是一种不正确的方法,因为多次回调,阻塞foreach以及我不知道如何在两个数组上执行类似连接的sql而不通过collection1循环并执行collection2.contains这一事实()对于每个元素......这似乎是缓慢而可怕的。
所以我的问题是1)什么是更好的方法? 2)如果这个方法在问题上是正确的,我怎样才能在内存中的两个数组上进行有效的类似sql的连接?