#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
forMyCollectionA
в ваших$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"}}
]);