Отказ от ответственности: Я ноб для Монго и для баз данных в целом, поэтому, если я учусь терминологии или понятиям, пожалуйста, дайте мне знать.Как выполнить атомные обновления полей документа MongoDB?
Для целей этого примера я хотел бы сохранить координаты мыши вместе внутри объекта, вложенного в документ. Этот документ будет выглядеть примерно так:
{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "mouseLoc" : { "x" : 10, "y" : 20 } }
Похоже atomic updating, via modifier operations, это путь, так как я только хранить ценности здесь (получение их в другом месте, в другом программном обеспечении). Однако я не могу понять часть запроса. Как получить доступ к этому документу, чтобы установить значения x и y?
Я использую Java, так что я в настоящее время пытается:
BasicDBObject mouseLoc = new BasicDBObject();
mouseLoc.put("x", mouseX);
mouseLoc.put("y", mouseY);
myCollection.update(queryObj, new BasicDBObject("$set", mouseLoc), true, false);
Однако, я не знаю, как определить, что queryObj, чтобы получить документ с ключом mouseLoc. В качестве альтернативы, если есть более умный способ хранения такой информации, пожалуйста, изучите меня.
Я могу следовать советам Mongo shell/JS, если это проще.
UPDATE:
Я могу запросить для этого документа, если я дам ему статическое поле, как «имя». Таким образом, чтобы обновить этот документ:
{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "name" : "mouseLoc", "mouseLoc" : { "x" : 10, "y" : 20 } }
я могу использовать этот код:
BasicDBObject mouseLoc = new BasicDBObject();
mouseLoc.put("x", mouseX);
mouseLoc.put("y", mouseY);
BasicDBObject queryObj = new BasicDBObject("name", "mouseLoc");
BasicDBObject updateObj = new BasicDBObject("$set", new BasicDBObject("mouseLoc", mouseLoc));
myCollection.update(queryObj, updateObj, true, false);
Тем не менее, представляется излишним иметь, чтобы указать, что поле «имя» просто, чтобы иметь возможность получить документ с ключ «mouseLoc». Может быть, я просто неправильно понимаю базу данных/дизайн монго?
ObjectId на самом деле просто скопирован прямо из оболочки find(), это не предмет Java. Правильно, вот как я использую параметр запроса. Однако я хотел бы просто извлечь документ с помощью некоторого «mouseLoc», независимо от его значения. Я недопонимаю дизайн базы данных? Должен ли я иметь уникальную пару имя-значение, например, ваш пример «_id», или мое обновление выше, которое использует поле «имя»? – ericsoco
Хорошо, теперь я понял. Я уточню свой ответ. –
@ericsoco Чтобы получить некоторый документ из 'mouseLoc', сделайте его' queryObj'.Однако, если вы обновляетесь до новых X и Y, у вас будут два 'mouseLoc': 'mouseLocBefore' (' queryObj') и 'mouseLocAfter' (объект обновления), и вы можете использовать оба в одном обновлении command: 'myCollection.update (mouseLocBefore, mouseLocAfter, true, false);'. –