2010-10-21 52 views
1

我正在将系统从sql server转换为mongodb。我相信这个项目是mongodb的一个很好的候选人,但那不是我的问题。MongoDB存储过程(JavaScript函数),它将文档作为结果返回之前更新文档?

在sql数据库中,我有一个存储过程,用于返回需要处理的一组记录。所以,我已经在sql数据库中处理了BIT和LastProcessingRequestDate DATETIME字段。在客户端更新要处理的记录= 1之前,记录需要1秒到5分钟的时间在客户端进行处理。

我的存储过程将返回一个TOP 100记录,其中处理= 0和LastProcessingRequestDate < DATEADD(分钟,-10,NOW()),但在它返回每条记录之前,它会更新LastProcessingRequestDate = NOW()。这可以确保在处理完它们之前,我没有收到任何已经处理的记录(有一个单独的线程负责保持队列中有多个要处理的记录,多个线程从中退出) 。

我想知道最好的做法是将这种情况转移到MongoDB。我想到的一个想法是创建一个类似MongoDB的函数,但我没有看到这种函数的任何示例。另一种方法是简单地使用相同的逻辑,但在客户端处理LastProcessingRequestDate的更新。这对我来说似乎不太理想。

有没有人有我如何在MongoDB中编写javascript函数的例子来做到这一点?谢谢!

回答

0

我真的认为某种形式的“客户端”或“业务对象/实体/数据对象”逻辑是为了这里。

另一种选择是基本上构建多个集合并将这些集合用于故事“处理”项目。

+0

我在想什么是获取文档_id然后做类似于: db.collection.update(“{_id:{$ in:[1,2,3]}}”,“{$ set :{lastProcessRequestDate:12345678}}“); 无论如何,这将产生预期的效果,只是不确定它是如何“高效”的。 – Redth 2010-10-21 16:24:04

+0

另外,多个集合并不能真正解决我的问题。我仍然需要一种将文档标记为“CurrentlyProcessing”的方法,以便在文档完成处理之前,我不会尝试再次抓取相同的文档进行处理。 – Redth 2010-10-21 16:27:22

+0

我明白你来自哪里。我对“$ in”条款的唯一体会是你不想让它太长。您基本上要求Mongo进行100次索引查找,然后再进行100次查找来设置数据。事实上,你会问MySQL的相同的东西,所以我不确定任何一种方式是真正有效的:( – 2010-10-23 23:02:57

相关问题