Вы всегда можете создать уникальный индекс, который заставит MongoDB отклонить конфликтующее сохранение. Рассмотрим следующее, выполненное с использованием оболочки mongodb:
> db.getCollection("test").insert ({a:1, b:2, c:3})
> db.getCollection("test").find()
{ "_id" : ObjectId("50c8e35adde18a44f284e7ac"), "a" : 1, "b" : 2, "c" : 3 }
> db.getCollection("test").ensureIndex ({"a" : 1}, {unique: true})
> db.getCollection("test").insert({a:2, b:12, c:13}) # This works
> db.getCollection("test").insert({a:1, b:12, c:13}) # This fails
E11000 duplicate key error index: foo.test.$a_1 dup key: { : 1.0 }
это будет работать;
select distinct a.table_name,(a.rows-b.rows) diff from table_growth a,table_growth b
where a.table_name=b.table_name;
Ваш второй запрос находится на правильном пути, но условие соединения частично отключено. Вы должны утверждать, что имена таблиц, а не идентификаторы, совпадают:
SELECT
x.table_name,
(x.rows - y.rows) AS diff
FROM table_growth x
INNER JOIN table_growth y
ON x.table_name = y.table_name and
DATE(y.timestamp) = '2019-03-02'
WHERE
DATE(x.timestamp) = '2019-03-01';
Примечание: ваш текущий вывод немного неоднозначен, потому что не ясно, какое значение rows
будет первым в разнице, или если возможно, вы хотите сообщить абсолютное значение.
Если у вас есть только одна строка на дату, то это может быть самый быстрый подход:
SELECT g.table_name,
SUM(CASE WHEN DATE(g.timestamp) = '2019-03-02'
THEN g.rows
WHEN DATE(g.timestamp) = '2019-03-01'
THEN -g.rows
ELSE 0
END) as diff
FROM dbadmin.table_growth g
WHERE g.timestamp >= '2019-03-01' AND
g.timestamp < '2019-03-03'
GROUP BY g.table_name;
В частности, это может использовать индекс на table_growth(timestamp, table_name, rows)
.