Агрегированный запрос для извлечения данных, которые не имеют пустого («») или нулевого значения, не работает должным образом

#mongodb #mongodb-query #aggregation-framework #mongodb-aggregation

#mongodb #mongodb-запрос #агрегация-фреймворк #mongodb-агрегация

Вопрос:

У меня есть этот агрегированный запрос для извлечения данных, которые не имеют пустого («») значения или нулевого значения в моей коллекции. Вот мой запрос :

 MyCollectionA.aggregate([
    {$lookup: { "from" : "MyCollectionB","localField" : "MyCollectionAId", "foreignField" : "_id", "as" : "myData"}},
    {$match: {"myData": {$nin: [null, "", " "]}}},
    {$group: {'_id': '$MyCollectionAId'}}]);
  

Этот обновленный запрос решил мои проблемы.

Данные MyCollectionA:

 { 
    "_id" : "AbqMZXWt4kwFbJM8Y", 
    "MyCollectionBId" : "DEW7QiEA5wbaFkKkJ", 
    "MyCollectionAName" : "asdfasdf"
}
{ 
    "_id" : "Ac2CJbz6o4xKQETAZ", 
    "MyCollectionBId" : "5JjzxkxfBsNXsWcrz", 
    "MyCollectionAName" : "asdfasdfads."
}
{ 
    "_id" : "AcE2WDqbRG9dv3Lsc", 
    "MyCollectionBId" : "5678179e20a3d410709ba7f4", 
    "MyCollectionAName" : "asfasfdasdf"
}
{ 
    "_id" : "AcXsSNc6jmmDyEF54", 
    "MyCollectionBId" : "2Cy9TpzeqwkTibLy9", 
    "MyCollectionAName" : "asdfasdfadsr"
}
  

Данные MyCollectionB:

 { 
    "_id" : "5JjzxkxfBsNXsWcrz", 
    "myField" : " "
}
{ 
    "_id" : "5678179e20a3d410709ba7f4", 
    "myField" : null
}
{ 
    "_id" : "2Cy9TpzeqwkTibLy9", 
    "myField" : "asdf"
}
  

Но этот запрос выдает мне выходные данные с пустым и нулевым значением.

Ожидаемый результат будет :

 { 
    "_id" : "2Cy9TpzeqwkTibLy9", 
    "MyCollectionBId" : "5JjzxkxfBsNXsWcrz",
    "myField" : "asdf"
}
  

Может ли кто-нибудь иметь представление об этом?

Комментарии:

1. Как насчет {$match: {"myData.0": {$exists: true}}} ?

2. Нет поля с ключом myField , MyCollectionA как указано в опции $lookup оператора "localField" : "myField" . Возможно, вы имели в виду "localField" : "MyCollectionAId" ? Кроме того, можете ли вы показать ожидаемый результат от приведенной выше агрегации?

3. @chridam «MyField» из MyCollectionB .

4. Если это от MyCollectionB why, то указано ли оно как localField for MyCollectionA в ваших $lookup параметрах оператора?

5. @chridam потому что я хочу найти данные, в которых в «MyField» не должно быть банковских или нулевых данных.

Ответ №1:

Используйте localField в качестве поля в вашей коллекции, откуда вы вызываете $lookup . В этом случае поле имеет значение ‘myCollectionBId’.

Кроме того, после этапа поиска соответствующие документы из внешней коллекции будут добавлены в виде массива к полю, которое упоминается в поле «как» на вашем этапе поиска $. Таким образом, вы не можете напрямую запрашивать «myData». Вы должны использовать оператор ‘$match’ для ‘myData.0.MyField’.

 db.MyCollectionA.aggregate([

{$lookup: { "from" : "MyCollectionB", "localField" : "MyCollectionBId", "foreignField" : "_id", "as" : "myData"}},

{$match :  { "myData":{$exists:true}, "myData.0.myField": {$nin: [null, "", " "]}}},

{$project: { "MyCollectionBId":1, "myField":"myData.0.myField"}}

]);