MongoDB:$ push和$ addToSet根本无法工作

时间:2017-02-12 21:34:37

标签: javascript json node.js mongodb

我是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无效的原因。

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了错误!

我只是没有仔细阅读文档,因为它说$ addToSet只能用于数组。 我试图更新子集合......

因此,要更新子集合,您需要使用$ set。如果您需要更新具有可变键名的特定字段,可以使用Javascript构建查询,如下所示:

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

然后就这样做:

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

希望这有帮助!