2012-02-13 3 views
3

Отказ от ответственности: Я ноб для Монго и для баз данных в целом, поэтому, если я учусь терминологии или понятиям, пожалуйста, дайте мне знать.Как выполнить атомные обновления полей документа 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». Может быть, я просто неправильно понимаю базу данных/дизайн монго?

ответ

0

В разделе запроса указывается способ поиска документа, например: _id или другое уникальное поле.

В вашем примере, это будет выглядеть следующим образом:

ObjectId objectId = new ObjectId("4f39805d35919a2a7c7aba3e"); 
BasicDBObject queryObj = new BasicDBObject("_id", objectId); 

(. Может быть, есть что-то не хватает около ObjectId, так как я не знаю, Java)

UPDATE

Если вы ищете конкретную mouseLoc, queryObj будет самым mouseLoc объектом. (В JSON это будет { 'x': mouseX, 'y': mouseY }.)

+0

ObjectId на самом деле просто скопирован прямо из оболочки find(), это не предмет Java. Правильно, вот как я использую параметр запроса. Однако я хотел бы просто извлечь документ с помощью некоторого «mouseLoc», независимо от его значения. Я недопонимаю дизайн базы данных? Должен ли я иметь уникальную пару имя-значение, например, ваш пример «_id», или мое обновление выше, которое использует поле «имя»? – ericsoco

+0

Хорошо, теперь я понял. Я уточню свой ответ. –

+0

@ericsoco Чтобы получить некоторый документ из 'mouseLoc', сделайте его' queryObj'.Однако, если вы обновляетесь до новых X и Y, у вас будут два 'mouseLoc': 'mouseLocBefore' (' queryObj') и 'mouseLocAfter' (объект обновления), и вы можете использовать оба в одном обновлении command: 'myCollection.update (mouseLocBefore, mouseLocAfter, true, false);'. –

0

что касается использования спецификатора .?

myCollection.updateOne(Document.parse("{ \"_id\" : ObjectId(\"4f39805d35919a2a7c7aba3e\")}"), 
    Document.parse("{$set:{ \"mouseLoc.x\" : "+mouseX+", \"mouseLoc.y\" : "+mouseY+" }") 
) 
Смежные вопросы