Mongodb字段约束最小值

时间:2015-07-23 02:50:14

标签: mongodb mongodb-query

我在mongodb中有一个字段,它是整数类型。我想在$ inc等更新操作上将最小值剪辑为零(0,它不应该为负)。

知道如何实现这种约束吗?感谢

2 个答案:

答案 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函数,在验证数据之前执行增量操作。但我仍然确定并发可能有一个你需要考虑的问题。