Node.js 基于条件更新mongo集合
我希望我的系统仅在用户获得授权时更新mongodb集合。我需要检查的信息就在文档本身中。因此,我需要在实际更新集合之前评估一个条件 他们说: “更新的选择条件。使用与find()方法相同的查询选择器。” 这让我找到了查询操作符 我的理解是,我能够使用文档本身的数据来决定文档是否得到更新 我目前的做法如下:Node.js 基于条件更新mongo集合,node.js,mongodb,Node.js,Mongodb,我希望我的系统仅在用户获得授权时更新mongodb集合。我需要检查的信息就在文档本身中。因此,我需要在实际更新集合之前评估一个条件 他们说: “更新的选择条件。使用与find()方法相同的查询选择器。” 这让我找到了查询操作符 我的理解是,我能够使用文档本身的数据来决定文档是否得到更新 我目前的做法如下: db.myCollection.update( { criteriaA: 'A', $where: function() { // I expect this
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”}
}
)
这是有意义的,因为这样的函数是“客户端”(如客户端到数据库)操作,实际上并不是在服务器上执行的。在那里获取您的信息并将其传递到查询中。您的文档清楚地包含“角色”信息,授权“角色”对其进行更新,因此只需正常使用即可