Files
NodeBB/src/database/mongo/sorted/add.js

74 lines
2.2 KiB
JavaScript
Raw Normal View History

2016-12-23 14:12:00 +03:00
'use strict';
module.exports = function (db, module) {
var helpers = module.helpers.mongo;
var utils = require('../../../utils');
2016-12-23 14:12:00 +03:00
module.sortedSetAdd = function (key, score, value, callback) {
callback = callback || helpers.noop;
if (!key) {
return callback();
}
if (Array.isArray(score) && Array.isArray(value)) {
return sortedSetAddBulk(key, score, value, callback);
}
if (!utils.isNumber(score)) {
return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]'));
}
2016-12-23 14:12:00 +03:00
value = helpers.valueToString(value);
2018-09-26 15:02:57 -04:00
db.collection('objects').updateOne({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true, w: 1 }, function (err) {
2016-12-23 14:12:00 +03:00
if (err && err.message.startsWith('E11000 duplicate key error')) {
return process.nextTick(module.sortedSetAdd, key, score, value, callback);
}
callback(err);
});
};
function sortedSetAddBulk(key, scores, values, callback) {
if (!scores.length || !values.length) {
return callback();
}
if (scores.length !== values.length) {
return callback(new Error('[[error:invalid-data]]'));
}
for (let i = 0; i < scores.length; i += 1) {
if (!utils.isNumber(scores[i])) {
return setImmediate(callback, new Error('[[error:invalid-score, ' + scores[i] + ']]'));
}
}
2016-12-23 14:12:00 +03:00
values = values.map(helpers.valueToString);
var bulk = db.collection('objects').initializeUnorderedBulkOp();
for (var i = 0; i < scores.length; i += 1) {
2017-02-18 12:30:49 -07:00
bulk.find({ _key: key, value: values[i] }).upsert().updateOne({ $set: { score: parseFloat(scores[i]) } });
2016-12-23 14:12:00 +03:00
}
bulk.execute(function (err) {
callback(err);
});
}
module.sortedSetsAdd = function (keys, score, value, callback) {
callback = callback || helpers.noop;
if (!Array.isArray(keys) || !keys.length) {
return callback();
}
if (!utils.isNumber(score)) {
return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]'));
}
2016-12-23 14:12:00 +03:00
value = helpers.valueToString(value);
var bulk = db.collection('objects').initializeUnorderedBulkOp();
for (var i = 0; i < keys.length; i += 1) {
2017-02-18 12:30:49 -07:00
bulk.find({ _key: keys[i], value: value }).upsert().updateOne({ $set: { score: parseFloat(score) } });
2016-12-23 14:12:00 +03:00
}
bulk.execute(function (err) {
callback(err);
});
};
2017-02-18 02:30:48 -07:00
};