Как увеличить существующее значение в MongoDB
Я использую платформу Stitch от MongoDB. Я хочу хранить value
и count
связано с этим значением в базе данных. Теперь value
может не присутствовать в первый раз, поэтому я хотел бы вставить value
с count = 1
, я могу использовать update()
обновить существующее значение счетчика, используя $inc
или я могу использовать upsert()
добавить значение в базу данных. Теперь дело в том, что у меня есть map
моих значений и количества, и я хочу вставить (обновить /upsert) все сразу. Я не хочу загружать сеть. Я использовал insertMany()
вставить map
сразу, но это явно не обновляет значение.
Так возможно ли это сделать?
PS Я использую Javascript для того же.
1 ответ
Согласно MongoDb 3.6:
db.collection.update(query, update, options)
Изменяет существующий документ или документы в коллекции. Метод может модифицировать определенные поля существующего документа или документов или полностью заменить существующий документ, в зависимости от параметра обновления.
Смысл в том, что вы можете сохранить несколько документов с помощью обновления.
Сначала вы должны создать массив из вашей карты, который содержит только значение.
const arrayOfValues = ['value_01', 'values_02'];
Затем вы должны использовать опции upsert + multi для метода update:
db.foo.update({value: { $in: arrayOfValues}}, {$inc: {count:1}}, { upsert: true, multi: true });
Тестовый вывод:
> db.createCollection("test");
{ "ok" : 1 }
> db.test.insertMany([{value: "a"}, {value: "b"}, {value: "c"}];
... );
2017-12-31T12:12:18.040+0200 E QUERY [thread1] SyntaxError: missing ) after argument list @(shell):1:61
> db.test.insertMany([{value: "a"}, {value: "b"}, {value: "c"}]);
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a48b8061b98cc5ac252e435"),
ObjectId("5a48b8061b98cc5ac252e436"),
ObjectId("5a48b8061b98cc5ac252e437")
]
}
> db.test.find();
{ "_id" : ObjectId("5a48b8061b98cc5ac252e435"), "value" : "a" }
{ "_id" : ObjectId("5a48b8061b98cc5ac252e436"), "value" : "b" }
{ "_id" : ObjectId("5a48b8061b98cc5ac252e437"), "value" : "c" }
> db.test.update({value: { $in: ["a", "b", "c"]}}, {$inc: {count:1}}, { upsert: true, multi: true });
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.test.find();
{ "_id" : ObjectId("5a48b8061b98cc5ac252e435"), "value" : "a", "count" : 1 }
{ "_id" : ObjectId("5a48b8061b98cc5ac252e436"), "value" : "b", "count" : 1 }
{ "_id" : ObjectId("5a48b8061b98cc5ac252e437"), "value" : "c", "count" : 1 }
> db.test.update({value: { $in: ["a", "b", "c"]}}, {$inc: {count:1}}, { upsert: true, multi: true });
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.test.find();
{ "_id" : ObjectId("5a48b8061b98cc5ac252e435"), "value" : "a", "count" : 2 }
{ "_id" : ObjectId("5a48b8061b98cc5ac252e436"), "value" : "b", "count" : 2 }
{ "_id" : ObjectId("5a48b8061b98cc5ac252e437"), "value" : "c", "count" : 2 }
> db.test.update({value: { $in: ["a", "b", "c"]}}, {$inc: {count:1}}, { upsert: true, multi: true });
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
Надеюсь, это было полезно:)