我必须处理MongoDB集合中不一致的文档,其中某些字段可能是数字或可能具有NaN值。我需要用$ inc更新它。但看起来像是NaN值$ inc没有效果。原子文档更新有哪些可用选项?
1
A
回答
3
那么这似乎导致了两个合乎逻辑的结论。首先是如果有一个字段中存在NaN
值,那么如何识别它们?考虑下面的示例,让我们称之为集“nantest”
{ "_id" : ObjectId("54055993b145d1c015a1ad41"), "n" : NaN }
{ "_id" : ObjectId("540559e8b145d1c015a1ad42"), "n" : Infinity }
{ "_id" : ObjectId("54055b59b145d1c015a1ad43"), "n" : 1 }
{ "_id" : ObjectId("54055ea1b145d1c015a1ad44"), "n" : -Infinity }
因此,无论NaN
和Infinity
或-Infinity
代表已经在某种程度上你的数据出现了“非数字”的。找到这些文档的最佳方式就是使用运算符来计算JavaScript评估的查询条件。效率不高,但你得到了:
db.nantest.find({
"$where": "return isNaN(this.n) || Math.abs(this.n) == Infinity"
})
因此,这给出了一种方法来找到问题的数据。从这里你可以跳过箍,并决定在遇到这种情况时,你只需在递增之前将它重置为0,基本上发出两条更新语句,如果值正确,则第一条语句不匹配文档以更新:
db.nantest.update(
{ "$where": "return isNaN(this.n) || Math.abs(this.n) == Infinity" },
{ "$set": { "n": 0 } }
);
db.nantest.update(
{ },
{ "$inc": { "n": 1 } }
);
但是,当你看到这个时,你为什么要修补你的代码以迎合这个问题呢?于是顺理成章的事情,最终得出结论:仅仅是更新一个声明中的所有Nan
,并可能Infinity
值标准复位数字:
db.nantest.update(
{ "$where": "return isNaN(this.n) || Math.abs(this.n) == Infinity" },
{ "$set": { "n": 0 } },
{ "multi": true }
);
运行一个语句,然后你不必改变你的代码,只是过程按照您通常的预期递增。
如果你的麻烦是知道哪些领域具有存在的Nan
值,以调用更新来解决这些问题,然后再考虑沿着这MapReduce的过程线的东西来检查字段:
db.nantest.mapReduce(
function() {
var doc = this;
delete doc._id;
Object.keys(doc).forEach(function(key) {
if (isNaN(doc[key]) || Math.abs(doc[key]) == Infinity)
emit(key, 1);
});
},
function (key,values) {
return Array.sum(values);
},
{ "out": { "inline": 1 } }
)
对于您可能需要为更多嵌套文档添加一些复杂性,但是这会告诉您哪些字段可能包含错误值,以便您可以构造更新语句来修复它们。
这似乎不是弯曲你的代码,以满足这个你“应该”做的:
查找导致数字出现,修复源。
标识字段或包含这些值
过程一次性更新语句来一次全部固定的数据字段。
与代码最小的混乱,它既修复了问题的“源头”,也修复了引入的数据损坏的“结果”。
相关问题
- 1. CALayer位置包含NaN:[nan -__]
- 2. 查找包含NaN的
- 3. 如何解决CALayerInvalidGeometry',原因:'CALayer的位置包含NaN:[nan nan]?
- 4. Mongodb:数组包含值并且不包含另一个
- 5. 排序包含NaN的列表
- 6. Python请求发布包含nan的json
- 7. 使用scipy对包含NAN的Y值进行线性回归
- 8. 获取中间值的指数中包含的NaN
- 9. PyMongo如果值不是NaN,则只包含文档中的字段
- 10. Pandas中日期列的最大值/最小值列包含nan值
- 11. Mongodb geo包含多边形
- 12. 的MongoDB:在包含对象
- 13. 包含空值
- 14. 包含空值
- 15. 的Python - 熊猫 - GROUPBY和“AGG” - 骨料设置为NaN时组包含NaN
- 16. NSUserDefaults包含值还是不包含?
- 17. MongoDB - 多个布尔标志或包含值的单个列表?
- 18. MongoDB - 查找给定字符串中是否包含字段值
- 19. ValueError:输入包含使用LinearRegression的dtype('float64')的NaN,无穷大或值太大
- 20. fit_transform中的错误:输入包含NaN,无穷大或值太大(dtype('float64'))
- 21. ValueError:输入包含NaN,无穷大或者对于dtype('float64')来说值太大
- 22. 包含NaN值的普罗米修斯直方图和平均集
- 23. MongoDB和Python - 包含列表的字典
- 24. 检查阵列包含元素的MongoDB
- 25. GET值包含XML
- 26. 填写NaN值
- 27. Long值为NaN
- 28. 如何找到mongodb中的前5个值?不应该包含相同的值
- 29. 字典值包含字典和值包含数组
- 30. 在预定行号处包含NaN矩阵行。
如果值为NaN,预期的行为是什么?它应该被视为0并增加?给出一些不是数字的字段值的示例数据。 – BatScream 2014-09-02 06:03:45