2017-02-12 134 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] 
) 

希望这有助于!