Как выполнить атомарные обновления полей документа MongoDB? - PullRequest
3 голосов
/ 14 февраля 2012

Отказ от ответственности: я новичок в Mongo и в базах данных в целом, поэтому, если я не согласен с терминологией или понятиями, пожалуйста, дайте мне знать.

Для целей этого примера я хотел быхранить координаты мыши вместе в объекте, вложенном в документ.Этот документ будет выглядеть примерно так:

{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "mouseLoc" : { "x" : 10, "y" : 20 } }

Кажется, что атомарное обновление с помощью операций модификатора - это путь, так как я только храню значения здесь (извлекаю их в другом местев другом программном обеспечении).Тем не менее, я не могу понять часть запроса.Как мне получить доступ к этому документу для установки значений 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.В качестве альтернативы, если есть более разумный способ хранения такой информации, пожалуйста, учите меня.

Я могу следовать советам по оболочке / JS Mongo, если это проще.

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

Ответы [ 2 ]

0 голосов
/ 02 августа 2017

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

myCollection.updateOne(Document.parse("{ \"_id\" : ObjectId(\"4f39805d35919a2a7c7aba3e\")}"),
    Document.parse("{$set:{ \"mouseLoc.x\" : "+mouseX+", \"mouseLoc.y\" : "+mouseY+" }")
)
0 голосов
/ 14 февраля 2012

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

В вашем примере это будет выглядеть так:

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

(Возможно, чего-то не хватает в ObjectId, поскольку я не знаю Java.)

ОБНОВЛЕНИЕ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...