代码之家  ›  专栏  ›  技术社区  ›  sds Niraj Rajbhandari

我能按字典的键查询MongoDB吗?

  •  0
  • sds Niraj Rajbhandari  · 技术社区  · 5 年前

    假设我的收藏 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大得多,所以我更喜欢更紧凑的内容(当然,我可以生成查询,但这不是重点)。

    密迪克特 ?

    有什么像

    c.find(query={"$keys(mydict)":{"$intersect":["foo","bar","xxx","yyy","zzz"]}})
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Tunmee    5 年前

    您可以编写一个简单的函数,将键列表转换为键到通配符值的映射。这是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"])
    })