我是mongoDB的初学者,我想将它用于NodeJS的项目。 一切都很好,直到我不得不更新我的收藏中的一些文件。
所以基本上,我有一个文件列表,我希望通过向列表添加内容来更新它。所以我正在尝试使用Update方法,但我真的很难使用$ addToSet和$ push(我的意思是他们只是不工作)。 我认为我的语法是正确的,因为如果我做了$ set,它就可以了,就像那样:
collection.update(
{ "keyboard.name":"k1" },
{
$set: {
keys: {
"myFirstKeyname": {"mySecondKeyname": "myValue"}
}
}
},
{
upsert: true
}
)
但如果我只是用$ addToSet或$ push替换$ set,它就不会对数据库做任何事情,但我也没有错误......
我在这里和那里读了很多东西,我看到很多人都有这个问题,但我找不到解决方案。
我的猜测是问题来自我尝试更新嵌套字段的事实,但我不确定。
所以我试着这样做:
$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无效的原因。
答案 0 :(得分:0)
好的,我终于找到了错误!
我只是没有仔细阅读文档,因为它说$ addToSet只能用于数组。 我试图更新子集合......
因此,要更新子集合,您需要使用$ set。如果您需要更新具有可变键名的特定字段,可以使用Javascript构建查询,如下所示:
let update = {};
update['yourSubCollection.' + yourVariableFieldName] = youValue;
然后就这样做:
collection.update(
yourQuery,
{
$set: update
},
[yourOptions]
)
希望这有帮助!