在这个结构中我想从输出(: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"}
}
}
}
答案 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可能适合您的任务。