2015-12-18 2 views
1

У меня есть 2 коллекции, и я пытаюсь получить все записи от Coll_A, где определенное поле (Field1) нет в Coll_B.mongodb - nin & regex на массиве

Проблема, с которой я столкнулся, заключается в том, что этот Field1 в , который содержит строковое значение, заполняется в конце белыми пространствами до определенной длины, но это дополнение отсутствует в другой коллекции.

Итак, для нижеследующего запроса массив vals имеет записи, которые не заполняются, поэтому, когда я использую db.Coll_A.find, он возвращает неверные результаты.

vals = db.Coll_B.find({}, 
         {"Field1" : 1, _id: 0}) 
       .map(function(a){ 
         return a.Field1; 
        }); 
db.Coll_A.find({ "Field1": { $nin: vals }}); 

Как я могу обойти это? Я искал, используя regex для игнорирования пробелов, но я не уверен, как это можно использовать здесь. Любая помощь будет действительно оценена. Благодарю.

ответ

0

Вы можете просто изменить возвращаемое значение к array из regular expressions и используйте его в своем $nin оператора.

код:

var exp = db.Coll_B.find({}, {"Field1" : 1, _id: 0}).map(function(a){ 
           return new RegExp(a.Field1+"\\s*$"); 
          }); 
db.coll_A.find({"Field1":{$nin:exp}}); 

Вы не можете использовать $regex оператор внутри $nin или $in операторов.

+0

Спасибо! Я не знал, что могу изменить возврат к массиву регулярных выражений. Это отлично сработало для меня. – user3723491

0

Я бы предложил исправить непоследовательные данные в коллекции. Обновите все записи, обрезая пробелы вокруг поля.

Если по каким-то причинам вы не можете или не хотите, чтобы это сделать, то вы можете использовать forEach и вручную сделать проверку

var results = []; 
db.Coll_A.find({}).forEach(function(row){ 
    if(row.Field1.trim().indexOf(vals) === -1){ 
    results.push(row); 
    } 
}); 
+0

Спасибо. В итоге я использовал предложение ниже, но хорошо иметь такие варианты для будущего использования, – user3723491

Смежные вопросы