Nano Hash - криптовалюты, майнинг, программирование

Запросить мангуста, получить последнее сообщение в каждом разговоре

У меня есть модельный чат:

var schema = mongoose.Schema({
   userSend:        {type: ObjectId, ref: 'User' },
   userReceive:         {type: ObjectId, ref: 'User' },
   message :        {type: 'String', require: true},
   status:          {type: 'Boolean', default: true}, 
   time:            {type: 'Date', default: Date.now}
}); 
module.exports = mongoose.model('Chat', schema);

Пожалуйста! помогите мне запросить, чтобы получить последнее сообщение друг друга разговор. То же, что разговор в фейсбуке.

это пример данных

{_id: '156478', msg: 'Hello lam', userSend: 'ZungX', userReceive:'Lam', timestamp: '2015-10-25T18:02:41.400Z'}
{_id: '586456', msg: 'hi My', userSend: 'Duc', userReceive:'My', timestamp: '2015-10-25T19:05:00.400Z'}
{_id: '254566', msg: 'Hello Duc', userSend: 'ZungX', userReceive:'Duc', timestamp: '2015-10-26T13:06:41.400Z'} 
{_id: '456899', msg: 'hi ZungX last', userSend: 'Duc', userReceive:'ZungX', timestamp: '2015-10-26T17:02:41.400Z'}
{_id: '987556', msg: 'Hello ZungX', userSend: 'Lam', userReceive:'ZungX', timestamp: '2015-10-26T20:01:41.400Z'}
{_id: '456878', msg: 'Chao Lam', userSend: 'ZungX', userReceive:'Lam', timestamp: '2015-10-26T21:54:21.400Z'} 

Теперь я хочу получить список разговоров пользователя ZungX.

Я хочу этот результат:

[
    {   
        msg:        'hi ZungX last',
        withUser:   'Duc', //it's userSend
        timestamp:  '2015-10-26T17:02:41.400Z'
    },
    {
        msg:        'Chao Lam',
        withUser:   'Lam', //it's userReceive
        timestamp:  '2015-10-26T21:54:21.400Z'
    }
]

У меня такая же проблема с поиском, но я не понимаю

Всем спасибо :D

'hi ZungX last' это последнее сообщение 'ZungX' с 'Duc'. примечание: это сообщение пользователя ZungX с ролью UserReceive

«Чао Лам» — это последнее сообщение «ZungX» с «Ламом». примечание: это сообщение пользователя ZungX с ролью UserSend

26.10.2015

  • У вас есть повторяющиеся _ids, также очень сложно понять, в чем проблема. Попробуйте добавить временные метки 26.10.2015
  • Сэр, я изменил _id (это демонстрационные данные) и добавил временную метку. 26.10.2015

Ответы:


1

Используйте структуру агрегации, чтобы получить желаемый результат. как показано на следующем примере:

var pipeline = [
    {
        "$match": {
            "userReceive": "ZungX"
        }
    },
    {
        "$project": {
            "msg": 1, "withUser": "$userSend", "timestamp": 1, "_id": 0
        }
    }
]

Chat.aggregate(pipeline)
    .exec(function(err, results){
        // handle err
        console.log(results);
    });

// Or use the aggregation pipeline builder for a more fluent call
Chat.aggregate()
    .match({ "userReceive": "ZungX" })
    .project({ "msg": 1, "withUser": "$userSend", "timestamp": 1, "_id": 0 })
    .exec(function(err, results){
        // handle err
        console.log(results);
    });
26.10.2015
  • Спасибо за ваш ответ. но я пробую, результата нет. массив пуст. 27.10.2015
  • Я запускаю снова, он запускается, но он получает текущий другой пользователь, отправляющий «ZungX». он не получает результат, который пользователь ZungX отправляет другому пользователю. Я думаю использовать $group, но я не знаю, как это использовать 27.10.2015

  • 2

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

    aggregate(
      [
        { $match: {$or: [{from: USERNAME}, {to: USERNAME}]}},
        { $project: {...FIELDS}},
        { $sort: { timestamp: -1} },
        {
          $group: {
            _id: {$concat: [{$userSend}, {$userReceive}]},
            userSend : {$first: '$from'},
            userReceive: {$first: '$to'},
            msg: {$first: '$msg'},
            timestamp: {$first: '$timestamp'}
          }
        }
      ]
    )
    

    Однако, если, как и я, ваши поля «userSend» и «userReceive» не были простыми строками (скажем, ObjectIds), то было бы неплохо добавить поле «conversationId», сохраняемое как:

    Chat.conversationId = [Receiver._id, Sender._id].sort().join('.')
    
    21.12.2015
    Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..