2017-02-12 9 views
0

Я новичок в mongoDB, и я хочу использовать его для проекта с NodeJS. Все было в порядке, пока мне не пришлось обновлять некоторые документы в моей коллекции.

Итак, у меня есть документ, который является списком вещей, и я хочу его обновить, добавив что-то в список. Поэтому я пытаюсь использовать метод Update, но я действительно борюсь с $ addToSet и $ push (я имею в виду, что они просто не работают). Я думаю, что мой синтаксис является правильным, потому что если я делаю $ набор, он прекрасно работает, как и что:

collection.update(
    { "keyboard.name":"k1" }, 

    { 
     $set: { 
      keys: { 
       "myFirstKeyname": {"mySecondKeyname": "myValue"} 
      } 
     } 
    }, 
    { 
     upsert: true 
    } 
) 

, но если я просто заменить $ устанавливается $ addToSet или $ толчке, он не делает что-нибудь в базу данных, но у меня также нет ошибки ...

Я читал много вещей здесь и там, и я видел, что у многих людей была эта проблема, но я не мог найти решение.

Я предполагаю, что проблема связана с тем, что я пытаюсь обновить вложенное поле, но я не уверен.

Так что я пытался сделать что-то вроде этого:

$addToSet: { 
    keys: { 
     [myFirstKeyname]: {"mySecondKeyname": "myValue"} 
    } 
} 

И я также пытался построить мой запрос в JavaScript так:

toInsert = JSON.parse(obj); // obj comes from the parameters of my function 
let keyName = Object.keys(toInsert)[0]; 
let fieldValue = toInsert[keyName]; 

let update = { $addToSet: { "keys": {} } } 

update['$addToSet']['keys'][keyName] = toInsert[keyName]; 
update = JSON.stringify(update) 

, который возвращает это:

{ "$addToSet": { "keys": { "myKeyName": {"value": "myValue", "type": "key"} } } } 

И он работает, если я заменил $ addToSet на $ set.

Я также пробовал обозначение точки, но он тоже не работал, и я не могу использовать его в своем случае, потому что мне бы хотелось, чтобы динамическое имя ключа для нового значения, которое я вставлял. Я также попытался скопировать и вставить пример, представленный в документах mongoDB, но он не сработал ...

Sooo ... Что я делаю неправильно? Кто-нибудь имеет образец, который работает? Может ли это произойти откуда-то еще, что мой код?

Редактировать: на самом деле, я пытался обновить подзаголовок, который отличается от массива. Вот почему $ addToSet не работал.

+1

Возможный дубликат [MongoDB - $, установленный для обновления или нажатия элемента Array] (http://stackoverflow.com/questions/24115088/mongodb-set-to-update-or-push-array-element) – matt

ответ

0

Хорошо, поэтому я, наконец, нашел ошибку!

Я просто не слишком внимательно читал документы, потому что он говорит, что $ addToSet работает только с массивом. Я пытался обновить субколлекцию ...

Итак, чтобы обновить субколлекцию, вам нужно использовать $ set. И если вам необходимо обновить конкретное поле, которое имеет переменное имя ключа, вы можете создать запрос с помощью Javascript, например:

let update = {}; 
update['yourSubCollection.' + yourVariableFieldName] = youValue; 

, а затем просто сделать:

collection.update(
    yourQuery, 
    { 
     $set: update 
    }, 
    [yourOptions] 
) 

Надеются, что это помогает!

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