Моя база данных 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
, но к полю с определенным значением.
Любое предложение высоко ценится.
$exists:false
это все, что вам нужно
Джон, мне нужны все записи, не содержащие пару {'date':'2020-12-01'}
Минский, $exists:false - это не то, что мне нужно, потому что запись без поля и значения {'date':'2020-12-01'} не вставляется в базу данных в начале.
Все отдельные записи в базе данных имеют поле {'date': somedate}. Но у некоторых биржевых тикеров нет {'date':'2020-12-01'}, а у всех остальных есть. Я хочу найти тех, у кого нет {'date':'2020-12-01'}
Как в этом случае будут выглядеть записи для Apple? просто включите это
Вы можете просто запросить любые отсутствующие поля, например, поиск документов по дате: «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, а не те тикеры, которые содержат правильные поля даты, но другие поля.
тогда может быть что-то вроде этого: > 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" ] } >
Я не вижу ясно вашего решения. Не могли бы вы опубликовать его как обычно? Между прочим, «бегущие строки»: [«D», «B»] не могут быть правильными, потому что я не могу добавить все бегущие строки в этом выражении.
Вот еще одно решение для вас, которое подойдет лучше:
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 .
Пожалуйста, отформатируйте код правильно. это больно глазам читать
Итак, вы хотите найти все записи, в которых
date
не равно2020-12-01
, включая записи, в которых вообще нет поляdate
?