我有一个集合,其中_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})
修改 经过仔细检查,上述方法毕竟不起作用。最后,我只需要添加新字段。
答案 0 :(得分:2)
免责声明:这有点破解它可能不会很好。
collection.distinct
方法获取明确_id
。Array.prototype.map()
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
。