我在mongodb中有一个字段,它是整数类型。我想在$ inc等更新操作上将最小值剪辑为零(0,它不应该为负)。
知道如何实现这种约束吗?感谢
答案 0 :(得分:1)
由于MongoDB本身是"无架构的"它无法真正强制执行任何"模式逻辑"本身就是这种约束。
您可以查看可用于您所选语言的对象文档映射器(ODM)库,但所有这些库通常都要求将数据加载到客户端中#34;为了在修改时强制执行这些限制。
此外,目前没有"运算符语法"允许这样的constaint,例如$inc
不会低于(或超过)某个值。
你能做什么"然而,使用"Bulk" operations API之类的东西来发送"两个"立即请求,分别做:
因此,对于一个简单的Min of of#34; 0"最大值为" 100"你会这样做:
var bulk = db.collection.initializeOrderedBulkOp();
// Increment document field
bulk.find({ "_id": idValue }).updateOne({
"$inc": { "counter": incValue }
});
// Set to Max if greater than Max
bulk.find({ "_id": idValue, "counter": { "$gt": 100 } }).updateOne({
"$set": { "counter": 100 }
});
// Set to Min if less than Min
bulk.find({ "_id": idValue, "counter": { "$lt": 0 } }).updateOne({
"$set": { "counter": 0 }
});
// Only sends and returns from server now
bulk.execute();
这意味着虽然实际上有三个"这里的操作是为了强制执行约束,实际上只有"一个"请求服务器和"一个"响应。
虽然它仍然是"三"操作,"临时"获取的价值非常小。因此,通常首选从服务器加载数据,然后在所有方面修改和保存内容。
答案 1 :(得分:0)
此选项效率不高,但可能是您
的选择之一 http://docs.mongodb.org/manual/tutorial/store-javascript-function-on-server/
您可以编写一个javascript函数,在验证数据之前执行增量操作。但我仍然确定并发可能有一个你需要考虑的问题。