0

在这种结构中,我想从输出中删除该特定列 :i "" ,这可能吗???

喜欢..输入是一样的

{

: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"}
          } 
    }

}

4

2 回答 2

2

由于(相当可怕的)模式无法以通用方式实现。您的架构现在允许查询嵌入文档中的字段,因为您需要知道更高级别文档的字段名称。换句话说,您不能有一个查询“取消所有 'x' 其中 'i' 为空”,因为您的架构不适合它。

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

于 2012-04-13T09:19:24.293 回答
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 。

于 2012-04-13T09:43:29.647 回答