如何使用Monger更新/插入MongoDB子文档



>我正在使用Clojure的Monger库连接到MongeoDB数据库。

我想在我的Mongo数据库中更新,插入和删除子文档。MongoDB的$push修饰符允许我在搜索文档的根目录上执行此操作。但我希望能够$push到子集合上。看看蒙格的测试,它看起来是可能的。但我想确保我可以推动第三父母的孩子收藏。蒙格能做这样的事情吗?

   (mgcol/update mycollection { :my-criteria-key "my-criteria-value" } { $push { "parent.3.child-collection" "fubar" }} (

更好的是能够在我的$push中加入$where条款。这样的事情可能吗?

   (mgcol/update mycollection          { :d oc-criteria-key "doc-criteria-value" }          { $push              { { $where { parent.child.lastname: 'Smith' } }              "fubar" } }    )

但即使在基本层面上,当我在 repl 中尝试以下命令时,我也会收到以下错误。

  1. "fubar"数据库肯定存在

  2. 我肯定已连接到数据库

  3. { :owner "fubar@gmail.com" }标准绝对有效;和

  4. 我尝试了"content.1.content""content.$.content"

   repl => (mc/update "fubar" { :owner "fubar@gmail.com" } { $push { "content.1.content" { "fu" "bar" } } } (    ClassCastException clojure.lang.Var$Unbound 不能强制转换为 com.mongodb.DB monger.collection/update (collection.clj:310(    repl =>    repl =>    repl => (clojure.repl/pst *e(    ClassCastException clojure.lang.Var$Unbound 不能强制转换为 com.mongodb.DB            monger.collection/update (collection.clj:310(            bkell.run.run-ring/eval2254 (NO_SOURCE_FILE:46(            clojure.lang.Compiler.eval (Compiler.java:6406(            clojure.lang.Compiler.eval (Compiler.java:6372(            Clojure.core/eval (core.clj:2745(            clojure.main/repl/read-eval-print--6016 (main.clj:244(            clojure.main/repl/fn--6021 (main.clj:265(            clojure.main/repl (main.clj:265(            用户/eval27/acc--3869--auto----30/fn--32 (NO_SOURCE_FILE:1(            java.lang.Thread.run (Thread.java:619(

有没有人遇到过这个问题并解决了它?

谢谢

您有一个由三部分组成的问题,描述中存在一些不一致和漏洞。 所以这是我最好的猜测,希望它很接近。

给定与您的更新请求匹配的架构,我可以让所有三个都工作,请参阅下面的 test/core.clj 了解完整的详细信息。

第一部分:是的,你可以推送到第三个父母的子集合,就像你写的那样。

第二部分:你想把你的"$where"子句移到条件中,并在objNew中使用$。

第三部分:是的,您的基本更新在下面对我有用,与您所写的完全一样。

"lein test"的输出在底部。 祝你一切顺利。

test/core.clj

(ns free-11749-clojure-subdoc.test.core
  (:use [free-11749-clojure-subdoc.core])
  (:use [clojure.test])
  (:require [monger.core :as mg] [monger.collection :as mgcol] [monger.query])
  (:use [monger.operators])
  (:import [org.bson.types ObjectId] [com.mongodb DB WriteConcern]))
(deftest monger-sub-document
    (mg/connect!)
    (mg/set-db! (mg/get-db "test"))
    (def mycollection "free11749")
    ;; first part
    (mgcol/remove mycollection)
    (is (= 0 (mgcol/count mycollection)))
    (def doc1 {
        :my-criteria-key "my-criteria-value"
        :parent [
                { :child-collection [ "cc0" ] }
                { :child-collection [ "cc1" ] }
                { :child-collection [ "cc2" ] }
                { :child-collection [ "cc3" ] }
                { :child-collection [ "cc4" ] }
            ]
        }
    )
    (mgcol/insert mycollection doc1)
    (is (= 1 (mgcol/count mycollection)))
    (mgcol/update mycollection { :my-criteria-key "my-criteria-value" } { $push { "parent.3.child-collection" "fubar" }} )
    (def mymap1 (first (mgcol/find-maps mycollection { :my-criteria-key "my-criteria-value" })))
    (is (= "fubar" (peek (:child-collection (get (:parent mymap1) 3)))))
    (prn (mgcol/find-maps mycollection { :my-criteria-key "my-criteria-value" }))

    ;; second part
    (mgcol/remove mycollection)
    (is (= 0 (mgcol/count mycollection)))
    (def doc2 {
        :doc-criteria-key "doc-criteria-value"
        :parent [
                    { :child  { :lastname [ "Alias" ] } }
                    { :child  { :lastname [ "Smith" ] } }
                    { :child  { :lastname [ "Jones" ] } }
                ]
        }
    )
    (mgcol/insert mycollection doc2)
    (is (= 1 (mgcol/count mycollection)))
    (mgcol/update mycollection { :doc-criteria-key "doc-criteria-value" "parent.child.lastname" "Smith"} { $push { :parent.$.child.lastname "fubar" } } )
    (def mymap2 (first (mgcol/find-maps mycollection { :doc-criteria-key "doc-criteria-value" })))
    (is (= "fubar" (peek (:lastname (:child (get (:parent mymap2) 1))))))
    (prn (mgcol/find-maps mycollection { :doc-criteria-key "doc-criteria-value" }))
    ;; third part
    (mgcol/remove "fubar")
    (is (= 0 (mgcol/count "fubar")))
    (def doc3 {
            :owner "fubar@gmail.com"
            :content [
                    { :content [ "cc0" ] }
                    { :content [ "cc1" ] }
                    { :content [ "cc2" ] }
            ]
        }
    )
    (mgcol/insert "fubar" doc3)
    (is (= 1 (mgcol/count "fubar")))
    (mgcol/update "fubar" { :owner "fubar@gmail.com" } { $push { "content.1.content" { "fu" "bar" } } } )
    (def mymap3 (first (mgcol/find-maps "fubar" { :owner "fubar@gmail.com" })))
    (is (= { :fu "bar" } (peek (:content (get (:content mymap3) 1)))))
    (prn (mgcol/find-maps "fubar" { :owner "fubar@gmail.com" }))
)

莱因测试

Testing free-11749-clojure-subdoc.test.core
({:_id #<ObjectId 4fb3e98447281968f7d42cac>, :my-criteria-key "my-criteria-value", :parent [{:child-collection ["cc0"]} {:child-collection ["cc1"]} {:child-collection ["cc2"]} {:child-collection ["cc3" "fubar"]} {:child-collection ["cc4"]}]})
({:_id #<ObjectId 4fb3e98447281968f7d42cad>, :doc-criteria-key "doc-criteria-value", :parent [{:child {:lastname ["Alias"]}} {:child {:lastname ["Smith" "fubar"]}} {:child {:lastname ["Jones"]}}]})
({:_id #<ObjectId 4fb3e98447281968f7d42cae>, :content [{:content ["cc0"]} {:content ["cc1" {:fu "bar"}]} {:content ["cc2"]}], :owner "fubar@gmail.com"})
Ran 1 tests containing 9 assertions.
0 failures, 0 errors.

相关内容

  • 没有找到相关文章

最新更新