Поиск записи массива по его идентификатору в коллекции MongoDB - PullRequest
2 голосов
/ 25 ноября 2011

Возможно ли это:

Я хотел бы обновить одну из «пользовательских историй» внутри проекта, может быть много проектов и много пользовательских историй внутри проекта.Я хотел бы выбрать проект по его идентификатору, а затем историю пользователя в этом проекте на основе его идентификатора и обновить его поля.

Вопрос: Какой запрос MongoDB я мог бы использовать?

Вырезание базы данных MongoDB

{
  "_id": ObjectId("4ecee95d6ce4004424000001"), //Project ID
  "owner": "test2",
  "stories": [
    {
      "_id": "75vUURHfE1bN9vkbwC2kR85s", //User story Id
      "title": "ok",
      "deadline": "10\/10\/2011",
      "description": "ok",
      "sp": "5",
      "value": "5",
      "roi": "1.00",
      "type": "story",
      "lane": 0
    },
    {
      "_id": "nTsa8x6vFJvdXfFtEHbcFIyl",
      "title": "test",
      "deadline": "10\/10\/2011",
      "description": "test",
      "sp": "5",
      "value": "5",
      "roi": "1.00",
      "type": "story",
      "lane": 0
    },
    {
      "_id": "i8Nd3HOhz7hZFzzInfCcapCe",
      "title": "test #2",
      "deadline": "10\/10\/2011",
      "description": "test #2",
      "sp": "5",
      "value": "5",
      "roi": "1.00",
      "type": "story",
      "lane": 0
    }
  ],
  "team": [

  ],
  "title": "ok"
}

В настоящее время я использую socket.io, и в случае события сокета я получаю следующие данные:

JSON

  var story = {
    _id: data.id,
    title: data.title,
    deadline: data.deadline,
    description: data.description,
    sp: data.sp,
    value: data.value,
    roi: data.roi,
    type: data.type
  }

Я хочу обновить историю в пределах «историй» в базе данных Монго, используя вышеуказанный объект JSON.

1 Ответ

3 голосов
/ 25 ноября 2011

В принципе, вы можете использовать оператор $ ( позиционный оператор ) для этого:

db.coll.update( {"stories._id":"i8Nd3HOhz7hZFzzInfCcapCe"}, 
                {$set:{"stories.$.roi":"1.25"}}, false, true )

Однако я считаю, что _id является зарезервированным именем;возможно, вам не следует использовать _id для встроенных объектов - у меня были проблемы с этим в оболочке, использующей MongoDB 2.0.1rc-1, поэтому вы можете попробовать sth.вот так:

db.coll.update( {"stories.id":"i8Nd3HOhz7hZFzzInfCcapCe"}, 
                {$set:{"stories.$.roi":"1.25"}}, false, true )

Есть некоторые предостережения : оператор $ работает только с первым сопоставленным элементом, и его нельзя использовать с upserts.

В качестве примечания: из информации, которую вы предоставляете, я чувствую, что лучше не встраивать пользовательские истории и использовать вместо этого отдельную коллекцию.

Одной из причин является то, что параллелизм станет болезненным, если вы используете встроенные коллекции (то есть, если многие люди одновременно редактируют один и тот же проект, вам нужно каким-то образом объединить массивы или использовать механизм блокировки).

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