Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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
MongoDB交易及;索引_Mongodb - Fatal编程技术网

MongoDB交易及;索引

MongoDB交易及;索引,mongodb,Mongodb,我对MongoDB相对来说比较陌生,并在实现受此技术启发的事务方面发挥了作用: 我正在考虑如何阻止给定源/目标帐户的同时事务。例如,我可以通过将源声明为唯一索引来阻止同一源上的同时事务: transactionsCollection.ensureIndex({"source":1}, {unique: true}); var newDoc = {source: sourceID, destination: destinationID, amount: 100, s

我对MongoDB相对来说比较陌生,并在实现受此技术启发的事务方面发挥了作用:

我正在考虑如何阻止给定源/目标帐户的同时事务。例如,我可以通过将源声明为唯一索引来阻止同一源上的同时事务:

transactionsCollection.ensureIndex({"source":1}, {unique: true});
var newDoc = {source: sourceID, destination: destinationID, 
              amount: 100, state:"pending"}
transactionsCollection.save(newDoc, {safe:true}, function(error, t) {
    if (error.name == "MongoError" && error.code == 11001)
        // duplicate index, so I'm locked out
}
但我真正想要的是,如果源或目标已经在事务表中(作为源或作为目标),则将其锁定

所以我的问题是,是否有可能以允许上述操作的方式设置索引,或者如果没有,还有什么其他方法可以实现这一点


谢谢

在记录内部的数组(
标记
下面)上使用唯一索引应该可以完成这项任务。例如:

db.test.save({ name: 'one', tags: [1, 2] });
db.test.save({ name: 'two', tags: [3, 4] });
db.test.ensureIndex({ tags: 1 }, {unique: 1});

db.test.save({ name: 'three', tags: [4, 5] });
E11000 duplicate key error index: test.test.$tags_1  dup key: { : 4 }

要实际放置一个答案,该答案确实回答了您将在评论中看到的问题,我建议在子文档上放置一个唯一的索引,以便该文档看起来像:

{
    _id:{},
    accounts: [1,2],
    source: 1,
    destination: 2
}
在accounts字段上放置唯一索引将在account 1和account 2上为任何挂起的事务生成一个锁,以便停止进一步的事务,直到该操作完成。因此,这意味着如果存在未决事务,那么无论源或目标是1还是2,它都将退出

但是,在某些情况下,对于这样的整体交易,您无法计算子文档的顺序。我不会使用子文档来判断交易的方向,例如:

dest_source: [1,2]
为了表示帐户1正在支付帐户2,因为此索引的顺序可能会随着您的保存方式而改变,因此我将仅使用子文档创建一个索引类型,该类型说明索引中的排列,同时使用
目的地
字段来实际了解索引的方向事务正在移动,因为即使文档更改了顺序,您仍然可以通过命名字段了解方向


我相信这正是OP真正想要的。

我认为唯一索引在MongoDB中的工作方式与其他索引不同,因此如果在源和目标上设置两个唯一索引,这将防止版本号等的升级。除非您指的是两者之间的复合值……这是不清楚的。如果我添加两个唯一索引,对于源和目标,如果新源是挂起事务的源(与目标相同),则会锁定我,但如果新源是挂起事务的目标,则不会锁定我。请稍候,您的描述并不清楚您希望如何锁定事务,你能添加具有预期结果的示例查询吗?因为我看到了你的函数,但我建议的索引应该锁定在该结构中,但似乎你想要第三个视角。这确实没有以任何重要的方式回答问题。它甚至与问题无关,所以我根据自己的评论给出了答案。