2013-11-06 2 views
3

В следующем документе записана беседа между Milhouse и Bart. Я хотел бы вставить новое сообщение с правильным номером (следующий в примере будет 3) в уникальной операции. Это возможно ?Mongodb: как автоматически увеличивать поле поддокумента?

{ user_a:"Bart", 
     user_b:"Milhouse", 
     conversation:{ 
      last_msg:2, 
      messages:[ 
       { from:"Bart", 
        msg:"Hello" 
        num:1 
       }, 
       { from:"Milhouse", 
        msg:"Wanna go out ?" 
        num:2 
       } 
      ] 
     } 
    } 

ответ

1

В MongoDB, массивы сохраняют порядок, поэтому, добавив атрибут num, вы только создавать больше данных за то, что вы могли бы выполнить без дополнительного поля. Просто используйте позицию в массиве, чтобы выполнить одно и то же. Схват сообщения X в массиве обеспечит более быстрый поиск, чем поиск { num: X }.

Чтобы сохранить порядок, я не думаю, что есть простой способ добавить num категории, кроме делает find() на conversation.last_msg, прежде чем вставить новый поддокумент и приращение last_msg.

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

Кроме того, я не использовал его, но есть Mongoose плагин, который может или не может быть в состоянии сделать то, что вы хотите: https://npmjs.org/package/mongoose-auto-increment

+0

После того, как я извлек сообщения, которые я хочу для использования их вне контекста Монго, я освобождаю информацию. Я хочу, чтобы каждый объект сообщения нести свой ранг в разговоре. – Cherif

+0

Вы возвращаете весь массив сообщений или возвращаете отдельные сообщения и хотите знать, какое положение у них было? – EmptyArsenal

0

Я бы рекомендовал использовать метку времени, а не числовое значение. Используя временную метку, вы можете сохранить порядок вложенного документа и использовать его.

Смежные вопросы