【问题标题】:MongoDB: $push and $addToSet don't work at allMongoDB:$push 和 $addToSet 根本不起作用
【发布时间】:2017-06-30 19:38:12
【问题描述】:

我是 mongoDB 的初学者,我想将它用于带有 NodeJS 的项目。 一切都很好,直到我不得不更新我收藏中的一些文档。

所以基本上,我有一个包含事物列表的文档,我想通过在列表中添加一些内容来更新它。所以我正在尝试使用 Update 方法,但我真的很难使用 $addToSet 和 $push (我的意思是它们根本不起作用)。 我认为我的语法是正确的,因为如果我执行 $set,它就可以正常工作,就像这样:

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

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

但如果我只是将 $set 替换为 $addToSet 或 $push,它不会对数据库执行任何操作,但我也没有错误...

我在这里和那里阅读了很多东西,我看到很多人都有这个问题,但我找不到解决方案。

我的猜测是问题出在我尝试更新嵌套字段的事实,但我不确定。

所以我尝试做这样的事情:

$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 不起作用的原因。

【问题讨论】:

标签: javascript json node.js mongodb


【解决方案1】:

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

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

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

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

然后就这样做:

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2018-10-14
    • 2018-04-27
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多