C# MongoDB选择内部更新查询

C# MongoDB选择内部更新查询,c#,sql-server,mongodb,C#,Sql Server,Mongodb,我使用MongoDB数据库作为一些导入操作的临时表。在将数据永久保存到SQL数据库之前,我想对数据执行一个存储过程。这依赖于使用Mongo内部的映射替换int字段中的4个字符 我不太确定如何在Mongo中执行此操作,但如果这些表位于SQL中,则查询将如下所示: UPDATE data SET number = IF LEN(number) >= 4 BEGIN CONCAT(SUBSTRING(number, 1, (LEN(number)-4)), (SELECT replac

我使用MongoDB数据库作为一些导入操作的临时表。在将数据永久保存到SQL数据库之前,我想对数据执行一个存储过程。这依赖于使用Mongo内部的映射替换int字段中的4个字符

我不太确定如何在Mongo中执行此操作,但如果这些表位于SQL中,则查询将如下所示:

UPDATE data SET number = 
IF LEN(number) >= 4 BEGIN
    CONCAT(SUBSTRING(number, 1, (LEN(number)-4)), (SELECT replacement FROM mapping WHERE original=SUBSTRING(number, (LEN(number)-4), 4))
END ELSE number
也就是说,如果数字为4位或更多,则用映射表中的替换项替换最后4位数字,否则不执行任何操作


有人能帮我翻译成MongoDB查询吗?我正在使用C,以防相关?我现在真的迷路了。

您不能在一个更新查询中完成这项工作,但您可以使用JavaScript函数更新必要的项目:

db.data.find().forEach(function (item) {
    var numberLength = item.number.length;
    if (numberLength >= 4) {
        var part1 = item.number.substring(0, numberLength - 4);
        var part2 = item.number.substring(numberLength - 4);

        var mapping = db.mapping.findOne({ original: part2 });

        item.number = part1 + (!!mapping ? mapping.replacement : "");
        db.data.save(item);
    }
});

我想,您应该在查询中写入LENnumber-4而不是LENnumber-4。第二个子字符串调用不接受任何字符串参数。是的,您是对的,修复了这些问题。我正在尝试避免将所有数据加载到内存中,因为我正在运行此过程的数据大小。一次百万也许是另一个解决方案。。。我是否可以向每个记录添加两个属性,在一个查询中使一个为原始的4位数字,在另一个查询中使另一个为映射中的4位替换数字,然后在第三个查询中更新数字?只是想让Mongo中的所有处理尽可能简化。没关系,我想那是行不通的,因为我仍然需要在更新查询中选择映射数字。。。该死。在与我的架构师交谈后,我们确定将数据加载到内存中并没有什么大不了的,所以我最终做了一些与您类似的事情,只是使用了我们自己已经定义的方法。然而,如果我们没有这些设置,这将是有效的。谢谢