如何从MongoDB集合的子文档中删除不匹配的值?

时间:2020-04-22 06:40:33

标签: mongodb dictionary document

我的一个mongoDB集合中有一个以下文档。

{"key":"CarName","value":{"default":"Unknown","MyCar":"TNK1234","YourCar":"TNW2342"}}

在本文档中,我只想将“ MyCar” 项目保留在 value 子文档中。

我尝试过

db.mycollection.update({{"key":"CarName"},{value.MyCar:0}},{$pull:{value.MyCar:0}});

但是整个文档都将被删除。不确定语法。

我希望文档看起来像

{'key':'CarName','value':{'TNK1234':'My Car'}}

对评论提出一些建议

我尝试了

db.mycollection.update({"key":"CarName"},{$unset:{"value.default:"","value.YourCar":""}});

有效

但是,如果要取消设置多个字段,我将不得不提及所有要删除的字段,因此我正在寻找替代方法。

1 个答案:

答案 0 :(得分:1)

如果您使用的是MongoDB 4.2,则可以指定管道来处理更新。一种实现方法是:

  • 将对象转换为键值对数组
  • 过滤数组,仅保留所需的键
  • 将数组转换回对象
  • 将值存储回原始字段
do 100 i=0,i_max
        do 101 j=0,j_max
                x(i,j) = r*cos(phi(i))*sin(theta(j)) 
                y(i,j) = r*sin(phi(i))*sin(theta(j))
                z(i,j) = r*cos(theta(j))
        101 continue
    100 continue

subroutine normal_and_Cp
    ! calculate cross product
    ! normal is n(i,j)
    ! First, creating 4 vectors using surrounded 4 points
    ! 

    !           (U)
    !           o
    !           |
    !           |
    !(L)o-------o-------o (R)
    !           |
    !           |
    !           o
    !           (B)

    double precision :: vec_R(3),vec_L(3), vec_U(3), vec_B(3), &
        & cross_RU(3), cross_UL(3), cross_LB(3), cross_BR(3), &
        & cross_avg(3)
    do 200 i=0,i_max-1
        do 201 j=0,j_max-1


                ! phi direction's change ?
                vec_R(1) = x(i+1,j) - x(i,j) ! x
                vec_R(2) = y(i+1,j) - y(i,j) ! y
                vec_R(3) = z(i+1,j) - z(i,j) ! z
                vec_L(1) = x(i-1,j) - x(i,j) ! x
                vec_L(2) = y(i-1,j) - y(i,j) ! y
                vec_L(3) = z(i-1,j) - z(i,j) ! z
                ! theta direction's change ?
                vec_U(1) = x(i,j+1) - x(i,j) ! x
                vec_U(2) = y(i,j+1) - y(i,j) ! y
                vec_U(3) = z(i,j+1) - z(i,j) ! z
                vec_B(1) = x(i,j-1) - x(i,j) ! x
                vec_B(2) = y(i,j-1) - y(i,j) ! y
                vec_B(3) = z(i,j-1) - z(i,j) ! z

                ! cross product using Right and upper
                cross_RU(1) = vec_R(2)*vec_U(3) - vec_R(3)*vec_U(2)
                cross_RU(2) = vec_R(3)*vec_U(1)- vec_R(1)*vec_U(3)
                cross_RU(3) = vec_R(1)*vec_U(2) - vec_R(2)*vec_U(1)

              ! cross product using upper and Left
                cross_UL(1) = vec_U(2)*vec_L(3) - vec_U(3)*vec_L(2)
                cross_UL(2) = vec_U(3)*vec_L(1) - vec_U(1)*vec_L(3) 
                cross_UL(3) = vec_U(1)*vec_L(2) - vec_U(2)*vec_L(1)

                ! cross product using Left and Bottom
                cross_LB(1) = vec_L(2)*vec_B(3) - vec_L(3)*vec_B(2)
                cross_LB(2) = vec_L(3)*vec_B(1) - vec_L(1)*vec_B(3)
                cross_LB(3) = vec_L(1)*vec_B(2) - vec_L(2)*vec_B(1)

                ! cross product using Bottom and Right
                cross_BR(1) = vec_B(2)*vec_R(3) - vec_B(3)*vec_R(2)
                cross_BR(2) = vec_B(3)*vec_R(1) - vec_B(1)*vec_R(3)
                cross_BR(3) = vec_B(1)*vec_R(2) - vec_B(2)*vec_R(1)

                cross_avg(1) = (cross_RU(1) + cross_UL(1) + cross_LB(1) + cross_BR(1))/4.0
                cross_avg(2) = (cross_RU(2) + cross_UL(2) + cross_LB(2) + cross_BR(2))/4.0
                cross_avg(3) = (cross_RU(3) + cross_UL(3) + cross_LB(3) + cross_BR(3))/4.0
                cross_avg(1) = cross_avg(1)/sqrt(cross_avg(1)*cross_avg(1)+1.0d-5)
                cross_avg(2) = cross_avg(2)/sqrt(cross_avg(2)*cross_avg(2)+1.0d-5)
                cross_avg(3) = cross_avg(3)/sqrt(cross_avg(3)*cross_avg(3)+1.0d-5)

                v(1)=0
                v(2)=0
                v(3)=-100*7
                if (dot_product(v,cross_avg) > 0) then
                    cp(i,j) = 2*((dot_product(v,cross_avg)) &
                        & /sqrt(v(1)*v(1) + v(2)*v(2) + v(3)*v(3)))**2
                else
                    cp(i,j)=0
                endif
        201 continue
    200 continue
end subroutine

Mongo Playground不支持更新,但这说明了管道阶段将执行的操作:Playground