【问题标题】:The dollar ($) prefixed field '$addToSet' in '$addToSet' is not valid for storage'$addToSet' 中的美元 ($) 前缀字段 '$addToSet' 对存储无效
【发布时间】:2015-04-28 00:11:56
【问题描述】:

我一直在尝试使用 node.js api 在 findAndModify 查询中使用 $addToSet。但是我收到一个错误,即前缀字段 $addToSet 对存储无效。该查询使用 mongo shell 客户端工作,但不能使用 api。

MongoClient.connect(config.mongo.uri, function(err, db) {
    assert.equal(null, err)
    console.log('Connected to mongodb');
    db.collection(‘users’).findAndModify(
         {‘username’: ‘foo’}, 
         [], 
         {$addToSet: {roles: “somerole”}}, 
         {upsert: true, new: true}, function(err, user) {
         if (err) console.log(err});
    });

上面的代码给了我一个错误,抱怨设置一个以受保护的关键字 $addToSet 开头的字段这个错误:

MongoError: 异常:'$addToSet' 中的美元 ($) 前缀字段 '$addToSet' 对存储无效。

版本: 蒙哥:2.6.6 节点mongodb:1.4.31

【问题讨论】:

  • 当我尝试它时效果很好,但我确实需要将智能引号更改为普通引号。不确定这是否只是复制和粘贴问题。

标签: mongodb


【解决方案1】:

随着 2.6 中的更改,我重写了代码以使用查找/更新。

MongoClient.connect(config.mongo.uri, config.mongo.options, function(err, db) {
    assert.equal(null, err)
    console.log('Connected to mongodb');

    db.collection('users').find({'username': username}, function(err, user) {
        var user_data = {'username': username}
        if (user) {
            user_data['$addToSet'] = { roles: item['RolesRoleName']};
            db.collection('users').update({_id: user._id}, user_data, function(err, user) {
                if (err) console.log(username, err);
                console.log("Updated", username);
            });
        } else {
            user_data['roles'] = [item.IsSuperUser == "TRUE" ? "admin" : "user"];
            db.collection('users').save(user_data, function(err, user) {
                if (err) console.log(username, err);
                console.log("Added", username)
        });
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2023-03-27
    • 2017-12-13
    • 2020-05-24
    相关资源
    最近更新 更多