Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 基于条件更新mongo集合_Node.js_Mongodb - Fatal编程技术网

Node.js 基于条件更新mongo集合

Node.js 基于条件更新mongo集合,node.js,mongodb,Node.js,Mongodb,我希望我的系统仅在用户获得授权时更新mongodb集合。我需要检查的信息就在文档本身中。因此,我需要在实际更新集合之前评估一个条件 他们说: “更新的选择条件。使用与find()方法相同的查询选择器。” 这让我找到了查询操作符 我的理解是,我能够使用文档本身的数据来决定文档是否得到更新 我目前的做法如下: db.myCollection.update( { criteriaA: 'A', $where: function() { // I expect this

我希望我的系统仅在用户获得授权时更新mongodb集合。我需要检查的信息就在文档本身中。因此,我需要在实际更新集合之前评估一个条件

他们说:

“更新的选择条件。使用与find()方法相同的查询选择器。”

这让我找到了查询操作符

我的理解是,我能够使用文档本身的数据来决定文档是否得到更新

我目前的做法如下:

db.myCollection.update( {
    criteriaA: 'A',
    $where: function() {
        // I expect this collection to update only when
        //  `current_user_is()` returns true
        return current_user_is( this.role );
    }, {
        $set: {
            criteriaB: 'B'
        }
    }
});
但显然,无论函数是否返回true,这都会插入文档

澄清:

db.myCollection.update( {
    criteriaA: 'A',
    $where: function() {
        // I expect this to bail the update, but it won't
        return false;
    }, {
        $set: {
            criteriaB: 'B'
        }
    }
});

如何在不改变文档本身结构的情况下实现这种条件更新?我还试图避免事先查询文档(除非它是这种情况下的正确方法)。

不,这不是正确的方法,原因有很多,但让我们从您假设的运算符用法开始

其目的是在数据库服务器上执行JavaScript条件。文档明确警告您使用它,因此一般来说,使用它不是一个好主意

唯一真正有效的原因,即使是这些,也应该避免使用该方法,是您需要将文档中一个字段的值与另一个字段的值进行比较

您要做的是让它执行一些数据库服务器上很可能不存在的代码。当然,出于您的目的,最简单的方法就是检索当前用户的“角色”,然后根据您想要更新的文档正常地(使用本机代码操作符而不是JavaScript)对其进行评估。或以基本形式:

var currentRoles=getUserRolesSomeHow();
db.collection.update(
{
“标准”:“A”,
“角色”:{“$in”:currentRoles}
},
{
“$set”:{“criteriaB”:“B”}
}
)    
这是有意义的,因为这样的函数是“客户端”(如客户端到数据库)操作,实际上并不是在服务器上执行的。在那里获取您的信息并将其传递到查询中。您的文档清楚地包含“角色”信息,授权“角色”对其进行更新,因此只需正常使用即可