2013-08-15 2 views
0

Я использую Монго для хранения личных сообщений, и, например, у меня есть массив следующим образом:MongoDB переупорядочивает массив и обновление

{ 
    "_id": { "$oid" : "520b842005ab0d0000000003" }, 
    "pmhistory": [ 
    { 
     "sendername": "Tati", 
     "preview": "Hey Man!", 
    }, 
    { 
     "sendername": "Dan", 
     "preview": "Hey Moon!", 
    }, 
    { 
     "sendername": "Hellen", 
     "preview": "Hello, Im proper!", 
    }, 
    ], 
    "user": { "$oid" : "520b842005ab0d0000000002" }, 
    "userid": "1" 
} 

Если Dan посылает новое сообщение, мне нужно, чтобы переместить его элемент массива в положение 0 (pmhistory [0]) и обновить поле предварительного просмотра.

Теперь я вынужден выпустить два запрос к базе данных, по одному с параметром $pull, что вынимает запись Dans из pmhistory массива, а другие с параметром $set, который добавляет запись Dans к началу pmhistory массива.

Возможно ли использовать 1 запрос вместо двух? Без получения have conflicting mods in update, потому что я изменяю размер массива.

ответ

1

Я думаю, что проще всего было бы не полагаться на порядок массива в первую очередь. Что я хотел бы сделать, это добавить дополнительное поле «last_update» каждому поддокументе, как:

{ 
    "_id": { "$oid" : "520b842005ab0d0000000003" }, 
    "pmhistory": [ 
    { 
     "sendername": "Tati", 
     "preview": "Hey Man!", 
     "last_updated": 1376581408222, 
    }, 
    { 
     "sendername": "Dan", 
     "preview": "Hey Moon!", 
     "last_updated": 1376581406444, 
    }, 
    { 
     "sendername": "Hellen", 
     "preview": "Hello, Im proper!", 
     "last_updated": 1376581508111, 
    }, 
    ], 
    "user": { "$oid" : "520b842005ab0d0000000002" }, 
    "userid": "1" 
} 

Тогда, когда Дэн имеет новое сообщение, вы можете просто запустить findAndModify так:

db.so.findAndModify({ 
    query: { "pmhistory.sendername" : "Dan" }, 
    update: { 
     $set: { "pmhistory.$.last_updated" : (new Date).getTime() } 
    }, 
    new: true 
}); 

Который затем возвращает:

{ 
    "_id" : ObjectId("520cf82fd3541122f936f72e"), 
    "pmhistory" : [ 
     { 
      "sendername" : "Tati", 
      "preview" : "Hey Man!", 
      "last_updated" : 1376581408 
     }, 
     { 
      "sendername" : "Dan", 
      "preview" : "Hey Moon!", 
      "last_updated" : 1376581716876 
     }, 
     { 
      "sendername" : "Hellen", 
      "preview" : "Hello, Im proper!", 
      "last_updated" : 1376581508 
     } 
    ], 
    "user" : ObjectId("520b842005ab0d0000000002"), 
    "userid" : "1" 
} 

Тогда в приложении, в части дисплея, просто убедитесь, что ваш заказ с помощью этой новой last_updated поля по убыванию.

+0

вид того, что я закончил использовать, прежде чем вы разместили это, но немного другое, спасибо в любом случае;) –

0

Вы можете использовать $ push в сочетании с $ slice, чтобы исправить размер массива и очистить последний элемент.

http://docs.mongodb.org/manual/reference/operator/slice/

+0

Я думаю, вы, возможно, неправильно поняли. С помощью среза я могу очистить последний элемент, однако он может быть не последним. (Посмотрите на обновленный код), после удаления элемента Dans я должен добавить элемент dans в начало массива. –

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