如何检查一个集合中_id的一部分是否出现在另一个集合中

时间:2015-04-14 16:25:48

标签: mongodb mongodb-query

我有一个集合,其中_id的格式为[message_code]-[language_code],而另一个集合的_id只是[message_code]。我想要做的是找到第一个集合中的所有文档,其中_id的message_code部分没有出现在第二个集合中。

示例:

> db.colA.find({})
{ "_id" : "TRM1-EN" }
{ "_id" : "TRM1-ES" }
{ "_id" : "TRM2-EN" }
{ "_id" : "TRM2-ES" }
> db.colB.find({})
{ "_id" : "TRM1" }

我想要一个从colA返回TRM2-EN和TRM-ES的查询。当然,在我的实时数据中,每个集合中都有数千条记录。

根据试图做类似事情的this question,我们必须保存针对colB的查询结果,并在针对colA的查询中以$ in条件使用它。在我的情况下,我需要在进行此比较之前剥离-[language_code]部分,但我找不到这样做的方法。

如果所有其他方法都失败了,我只会在colA中创建一个只包含消息代码的新字段,但是有更好的方法吗?

修改 根据Michael的回答,我能够提出这个解决方案:

var arr = db.colB.distinct("_id")
var regexs = arr.map(function(elm){
   return new RegExp(elm);
})
var result = db.colA.find({_id : {$nin : regexs}}, {_id : true})

修改 经过仔细检查,上述方法毕竟不起作用。最后,我只需要添加新字段。

2 个答案:

答案 0 :(得分:2)

免责声明:这有点破解它可能不会很好。

var arr = db.colB.distinct('_id');
arr.map(function(elm, inx, tab) {
    tab[inx] = new RegExp(elm); 
});

db.colA.find({ '_id': { '$nin': arr }})

答案 1 :(得分:1)

我会向colA添加一个新字段,因为您可以将其编入索引,如果每个documents中有数十万collection分割,则字符串会非常缓慢。< / p>

但是如果您不想这样做,您可以使用聚合框架的$substr运算符来提取[message-code],然后对结果执行$match