2017-02-12 62 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"} } } } 

它可以用$ set替換$ addToSet。

我也嘗試了點符號,但它也不起作用,而且我也無法真正使用它,因爲我想爲插入的新值使用動態鍵名。 我也嘗試複製和粘貼mongoDB文檔中提供的示例,但它不起作用...

Sooo ...我做錯了什麼?有沒有人有一個有效的樣本? 這可能來自我的代碼的其他地方嗎?

編輯:實際上,我試圖更新一個子集合,它與數組不同。這就是爲什麼$ addToSet不起作用。

+1

可能重複的[MongoDB - $ set更新或推數組元素](http://stackoverflow.com/questions/24115088/mongodb-set-to-update-or-push-array-element) – matt

回答

0

好吧,我終於找到了錯誤!

我只是沒有仔細閱讀文檔,因爲它說$ addToSet只能用於數組。 我試圖更新子集合...

因此,要更新子集合,您需要使用$集合。如果你需要更新具有可變鍵名的特定字段,你可以建立支持JavaScript的查詢,例如:

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

,然後就去做:

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

希望這有助於!