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

How to check if a portion of an _id from one collection appears in another

我有一个集合,其中 _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" }

我想要一个 return 来自 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})

编辑: 仔细一看,上面的方法终究是行不通的。最后,我只需要添加新字段。

我会在 colA 中添加一个新字段,因为您可以对其进行索引,如果每个 collection 中有数十万个 documents,那么拆分字符串将会非常缓慢.

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

免责声明:这是一个小技巧,可能不会有好结果。

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

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