2012-06-15 2 views
2

В моем MongoDB у меня есть Document1, как показано ниже. Я хочу обратиться к документу «main.accounts» (а затем и «main.entries») и обновить ($ set) весь поддокумент в массиве «content». Поддокументы Wrt до сих пор я «Мне удалось обновить весь документ, а не просто обновить ($ set) одно свойство в совпадающем документе.

Ниже я попытался использовать только $ set, $ set с $ elemMatch. И я также попробовал findAndModify, но безуспешно. Конечно, у меня есть) RTFM, посмотрел вокруг ii) интернет и III) SO, чтобы найти решение. кто-нибудь был в состоянии обновить весь документ таким образом?

Благодаря Тим

Update попробовать 1 - это единственное обновление, которое работает, но устанавливает все "содержимое" массив в хэш ... { "фу": "бар"}

 

    db.bookkeeping.update(
     { 
     owner : "[email protected]", 
     "content.content.tag" : "account", 
     "content.content.id" : "one" 
     }, 
     { $set : { "content.$.content" : { "fu" : "bar" } } } 
    ) 

Update попробовать 2 - это не обязательно, но не обновляет документ в вопросе

 

    db.bookkeeping.update(
     { 
     owner : "fu", 
     thing : { $elemMatch : { "content.content.tag" : "account", "content.content.id" : "one" } } 
     }, 
     { $set : { "thing" : { "fu" : "bar" } } } 
    ) 

Update попробовать 3 - это не обязательно, но не обновляет документ в вопросе

 

    db.bookkeeping.update(
     { thing : { $elemMatch : { owner : "fu" , "content.content.tag" : "account", "content.content.id" : "one" } } }, 
     { $set : { "thing.content.content.$" : { "fu" : "bar" } } } 
    ) 

Document1

 

    { 
      "_id" : "fid", 
      "content" : [ 
        { 
          "content" : [ 
            { 
              "id" : "one", 
              "tag" : "account" 
            }, 
            { 
              "id" : "two", 
              "tag" : "account" 
            }, 
            { 
              "id" : "three", 
              "tag" : "account" 
            }, 
            { 
              "id" : "four", 
              "tag" : "account" 
            }, 
            { 
              "id" : "five", 
              "tag" : "account" 
            } 

          ], 
          "id" : "main.accounts", 
          "tag" : "accounts" 
        }, 
        { 
          "tag" : "journals", 
          "id" : "main.journals", 
          "content" : [ 
            { 
              "tag" : "journal", 
              "id" : "generalledger", 
              "name" : "generalledger", 
              "type" : "", 
              "balance" : "", 
              "content" : [ 
                { 
                  "tag" : "entries", 
                  "id" : "main.entries", 
                  "content" : [ ] 
                } 
              ] 
            } 
          ] 
        } 
      ], 
      "owner" : "fu", 
      "tag" : "fubar" 
    } 

+0

какой документ вы хотите обновить. смущенный вопросом. почему вы продолжаете говорить об обновлении ($ set)? – c0deNinja

+0

Я пытаюсь обновить объект: '{" id ":" one "," tag ":" account "}'. И я имею в виду это функционально, я хочу обновить указанный документ. И я пытаюсь сделать это с помощью оператора $ set. Hth. – Nutritioustim

ответ

1

Вы не сможете использовать позиционный оператор $ для обновления второго уровня массива. (Array внутри массива)

This link может помочь вам

+0

Привет, Рави, спасибо за понимание '' 'позиционного оператора. Но wrt обновляет значение, эта ссылка показывает только обновление одного элемента хэша, например ... ** name: «Smells Like Teen Spirit !!» **. Мне не удалось обновить весь документ, например '{name:« Smells Like Teen Spirit !! », order: 1, duration: 301}'. Могу ли я сделать это с помощью ** $ set **? Благодарю. – Nutritioustim

+1

Хорошо, я решил это, используя позиции жесткого кодирования в пути запроса и обновления. И эта ссылка подсказывала мне решение, поэтому спасибо.Итак, у меня есть что-то вроде следующего (код Clojure, вызывающий mongodb): '(mc/update" bookkeeping "{: owner uname" content.1.content.0.content.0.content.tag "" entry "} {mop/$ set {: content.1.content.0.content.0.content. $ entry}}) '. Это я, или семантика обновления для MongoDB действительно запутанная и плохо объясненная? В любом случае, спасибо. – Nutritioustim

-1

Я считаю, что вы не можете сделать это на консоли mongoDB без какой-либо логики программирования, потому что вы используете несколько массивов в своей структуре, и вы выполняете поиск g для вспомогательного документа (содержимое [документы]) (main.accounts и main.entries) в массиве, который будет возвращать один и тот же корневой документ, но в этом возвращаемом значении вы не можете знать, в какой позиции в массиве содержимого критерии. Из-за этого вы не можете вводить новые значения в нужное положение.

Если возможно, я рекомендовал бы реструктурировать документ, чтобы избежать так много вложенных массивов (content-> content-> content-> content), особенно если вы планируете делать некоторые обновления на их подмножестве. В конце концов, это NoSQL, поэтому его «хорошо иметь некоторые избыточные данные в вашем дизайне, пока это упростит вашу жизнь и ваш код станет более чистым.

+3

Справа. Так что одна из вещей, которые это упражнение научила меня, - это то, что NoSQL, вероятно, не подходит ни к чему, кроме очень плоской структуры. Похоже, он не должен быть глубже 1 уровня. Я не согласен с тем, что в любой современной службе передачи данных должно быть сложно что-то обновить в любом месте документа. Кроме того, [JQuery Selectors] (http://api.jquery.com/category/selectors/) (и даже [XQuery] (http://en.wikipedia.org/wiki/XQuery)) решил сейчас. Нет, я не склонен реструктурировать свои документы, чтобы успокоить ограничения MongoDB. – Nutritioustim

+0

@golja Разве это не что-то, что связано с структурами данных, привязанными к документу NoSQL? Способность гнездовать вещи, поэтому нам не нужно иметь коллекции повсюду? Я согласен с nutritioustim – k00k

Смежные вопросы