嵌套结构简化

时间:2012-04-13 08:03:58

标签: mongodb clojure

在这个结构中我想从输出:i“”中删除该特定列而不是可能的???

like..input相同

{

:aa {:a "a_val",:b "b_val"},

:qq {:abc 
        {
            :x1 {:x "abc",:u "ee"},
            :x2 {:y "abc",:i "ee"},
            :x3 {:x "abc",:i ""}
    }   
    },
:ww {:xyz {
            :y1 {:x "abc",:u "ee"},
            :y2 {:y "abc",:i ""},
            :y3 {:x "abc",:i "ee"}
          } 
    }

}

但它的输出就像......

{

:aa {:a "a_val",:b "b_val"},
:qq {:abc 
        {
            :x1 {:x "abc",:u "ee"},
            :x2 {:y "abc",:i "ee"}
    }   
    },
:ww {:xyz {
            :y1 {:x "abc",:u "ee"},
            :y3 {:x "abc",:i "ee"}
          } 
    }

}

2 个答案:

答案 0 :(得分:2)

由于(相当可怕)架构不能以通用方式进行。您的架构现在允许查询嵌入式文档中的字段,因为您需要知道更高级别文档的字段名称。换句话说,您无法查询"取消所有' x'在哪里'我'是空的"因为你的架构不适合它。

您必须重新设计架构以允许您需要执行的操作。通常首先写下您需要对数据执行的操作,然后设计一个最有效地使用最常用用例的模式。

答案 1 :(得分:1)

根据您之前的问题构建...这既可以进行原始过滤,也可以消除深度子​​元素。

user> (defn vvals [m] (when (map? m) (vals m)))
'user/vvals
user> (into {}
        (for [[k v] xx
              :when (some #{"0"} (for [v (vvals v), v (vvals v)] (:i v)))
              :let [v (map (fn [[k v]] [k (into {} (remove #(= (:i (val %)) "0") v))]) v)]]
           [k (into {} v)]))

这很有效,但它变成了一个丑陋的混乱。也许考虑一下@Remon van Vliet给出的建议。还有zippers API可能适合您的任务。