Как проверить, отсутствует ли поле с определенным значением в MongoDB

Моя база данных MongoDB содержит записи с такой образцом информации, как показано ниже:

{_id:5fe206baad98b1198a5f688d,
ticker:"A",
date:"2020-12-18",
open:119.2300033569336,
close:119.30000305175781,
adjclose:119.30000305175781,
high:119.86000061035156,
low:118.44000244140625,
vol:3911800
}

Однако поставщик данных иногда не предоставляет все данные. Например, я получил данные по всем остальным акциям на 1 декабря 2020 года, но данные по акциям Apple на эту дату отсутствуют. При таких обстоятельствах данные 2020-12-01 об акциях Apple отсутствуют в базе данных.

Я хочу узнать, какие акции не содержат поля даты со значением 2020-12-01. Я пробовал что-то вроде $exists:true, но это относится только к Field, но к полю с определенным значением.

Любое предложение высоко ценится.

Итак, вы хотите найти все записи, в которых date не равно 2020-12-01, включая записи, в которых вообще нет поля date?

John Gordon 24.12.2020 19:44
$exists:false это все, что вам нужно
Minsky 24.12.2020 19:50

Джон, мне нужны все записи, не содержащие пару {'date':'2020-12-01'}

Jonathan Zhou 24.12.2020 20:10

Минский, $exists:false - это не то, что мне нужно, потому что запись без поля и значения {'date':'2020-12-01'} не вставляется в базу данных в начале.

Jonathan Zhou 24.12.2020 20:12

Все отдельные записи в базе данных имеют поле {'date': somedate}. Но у некоторых биржевых тикеров нет {'date':'2020-12-01'}, а у всех остальных есть. Я хочу найти тех, у кого нет {'date':'2020-12-01'}

Jonathan Zhou 24.12.2020 20:14

Как в этом случае будут выглядеть записи для Apple? просто включите это

Minsky 24.12.2020 22:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
170
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете просто запросить любые отсутствующие поля, например, поиск документов по дате: «2020-12-18», в которых отсутствует поле «high» или поле «vol»:

> db.test.find({ })

{ "_id" : ObjectId ("5fe50e06977b2c66b4166afc"), "тиккер" : "A", "дата": "2020-12-18", "открыть" : 1, "закрыть" : 1, "adjclose": 1, «высокий»: 1, «том»: 3 }

{ "_id" : ObjectId("5fe50e15977b2c66b4166afd"), "тиккер" : "A", "дата": "2020-12-18", "открыть" : 1, "закрыть" : 1, "adjclose" : 1, "высокий": 1 }

{ "_id" : ObjectId("5fe50e4b977b2c66b4166afe"), "тиккер" : "A", "дата": "2020-12-18", "открыть" : 1, "закрыть" : 1, "adjclose" : 1 }

db.test.find({date:"2020-12-18", $or:[ {vol:null} ,{high:null} ] })

{ "_id" : ObjectId("5fe50e15977b2c66b4166afd"), "тиккер" : "A", "дата": "2020-12-18", "открыть" : 1, "закрыть" : 1, "adjclose" : 1, "высокий": 1 }

{ "_id" : ObjectId("5fe50e4b977b2c66b4166afe"), "тиккер" : "A", "дата": "2020-12-18", "открыть" : 1, "закрыть" : 1, "adjclose" : 1 }

Извините, это не решает мою проблему. Я хочу узнать, какие биржевые тикеры не содержат поля даты со значением 2020-12-01, а не те тикеры, которые содержат правильные поля даты, но другие поля.

Jonathan Zhou 25.12.2020 00:09

тогда может быть что-то вроде этого: > db.test.aggregate([ {$match:{date:{$nin:["2020-12-01"]}}} ,{ $group:{_id:"All_not_having_2020-12- 01", тиккеры: {$addToSet:"$ticker"} } } ]) { "_id" : "All_not_having_2020-12-01", "тиккеры" : [ "D", "B" ] } >

R2D2 25.12.2020 21:25

Я не вижу ясно вашего решения. Не могли бы вы опубликовать его как обычно? Между прочим, «бегущие строки»: [«D», «B»] не могут быть правильными, потому что я не могу добавить все бегущие строки в этом выражении.

Jonathan Zhou 26.12.2020 02:01
Ответ принят как подходящий

Вот еще одно решение для вас, которое подойдет лучше:

db.t1.find({})

{ "_id": ObjectId ("5fe74967d3c3a4b9fe8dc5c2"), "тикер": "A", "дата": "2020-12-19" } { "_id": ObjectId ("5fe7496dd3c3a4b9fe8dc5c3"), "тикер": "B", "дата": "2020-12-19" } { "_id": ObjectId ("5fe74971d3c3a4b9fe8dc5c4"), "тикер": "C", "дата": "2020-12-19" } { "_id": ObjectId ("5fe74979d3c3a4b9fe8dc5c5"), "тикер": "A", "дата": "2020-12-20" } { "_id": ObjectId ("5fe74980d3c3a4b9fe8dc5c6"), "тикер": "C", "дата": "2020-12-20" } { "_id": ObjectId ("5fe7498ad3c3a4b9fe8dc5c7"), "тиккер": "A", "дата": "2020-12-21" } { "_id": ObjectId ("5fe75139d3c3a4b9fe8dc5c8"), "тикер": "N", "дата": "2020-12-25" }

db.t1.aggregate([ {$match:{date:"2020-12-20"}} , {$group:{_id:"All_having_the_date",  tickers:{$addToSet:"$ticker"}    }}  ]).forEach(function(d){ var all=db.t1.distinct("ticker");var e = all.filter(f => !d.tickers.includes(f));   print(e)    })

Б,Н

Объяснение: Вы выбираете все тикеры с датой: «2020-12-20» и извлекаете из списка отдельных тикеров те, которые отсутствуют в дате: «2020-12-20» , в приведенном выше примере это тикер B и тикер N .

Пожалуйста, отформатируйте код правильно. это больно глазам читать

Minsky 26.12.2020 16:12

Другие вопросы по теме