Могу ли я запросить MongoDB по ключам словаря? - PullRequest
0 голосов
/ 06 февраля 2020

Предположим, что в моей коллекции c есть записи, подобные этой:

{ "_id": 1, "mydict":{"foo":..., "bar":..., "baz":..}, ...}
{ "_id": 2, "mydict":{"foo":..., "quux":..., "zot":..}, ...}
{ "_id": 3, "mydict":{"fuu":..., "quux":..., "xxx":..}, ...}

Я хочу выбрать из данного набора записи, содержащие любые ключи, например, ["baz","zot"], имеют положительные значения в поле mydict.

Я мог бы написать что-то вроде

c.find(query={
    "$or":[
        {"mydict.baz":{"$gt":0}},
        {"mydict.zot":{"$gt":0}},
    ]})

, но список ключей будет намного больше 2, поэтому я бы предпочел что-то более компактное ( Конечно, я могу сгенерировать запрос, но это не главное).

Что если мне нужно просто проверить, присутствуют ли ключи в mydict?

Есть ли что-то вроде

c.find(query={"$keys(mydict)":{"$intersect":["foo","bar","xxx","yyy","zzz"]}})

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете написать простую функцию, которая преобразует список ключей в отображение ключей в значения подстановочных знаков. Это пример того, как это выглядело бы в Javascript (извините, я не python человек):

function mapKeys (keys) {
  const mappedKeys = keys.map(function(key) {
    return {
      // Note that I'm using the $exists here instead of $gt as
      // $exists actually checks if the field exists
      [`mydict.${key}`]: { "$exists": true }
    }
  })
  return mappedKeys;
}

Затем вы можете написать свои запросы к БД следующим образом:

c.find(query={
    "$or": mapKeys(["foo","bar","xxx","yyy","zzz"])
})
...