node.js - Mongoose - 聚合添加 'is_self' 字段

标签 node.js mongodb mongoose mongodb-query aggregation-framework

我正在构建一个聊天应用程序,它应该从 MongoDB 检索所有新消息,并分组到对话中。但每条消息都应该有一个新的“is_self”字段

编辑: “is_self”字段包含一个 bool 值,表示消息是否来自用户。

如此伪:

is_self: {$cond: {if: {message.sender == MYID)}, then: true, else: false}

假设我有消息模型

    var MessageSchema  = new Schema({
    conversation_id:{type: mongoose.Schema.ObjectId, ref: 'Conversation', required: true},
    message: {type: String, required: true},
    sender: {type: mongoose.Schema.ObjectId, ref: 'User'},
    created: {type: Date, default: Date.now},
    read: {type: Boolean, default: false}
});

和对话模型

    var ConversationSchema = new Schema({
    from: {type: mongoose.Schema.ObjectId, ref: 'User', required: true},
    to: {type: mongoose.Schema.ObjectId, ref: 'User', required: true},
    last_changed: {type: Date, default: Date.now},
    created: {type: Date, default: Date.now}
});

现在我尝试做一个聚合,以加载在conversation_id数组内并创建>last_checked日期的所有消息...

所以它看起来像这样:

mongoose.model("Message").aggregate([
            // First find all messages
            {
                $match: {
                    $and: [{conversation_id: {$in: idArray}}, {created: {$gt: lastChecked}}]
                }
            },
            // Add is self field
            {
                $group: {
                    _id: $_id,
                    $is_self: {
                        $cond: {'if(message.sender == MYID then true else false': '??'}
                    }
                }
            },
            // Sort by date
            {$sort: {created: -1}},

            // Then group by conversation
            {
                $group: {
                    _id: '$conversation_id',
                    messages: {
                        $push: '$$ROOT'
                    },

                }
            }
            // TODO: find users for unknown conversation
            /*,
            {
                $project: {
                    user: {
                        $or: [{conversation_id: {$in: knownConversations}}]
                    }
                }
            }*/
        ])

我尝试使用 $cond 和 if/else 语句,但 Mongo 不允许这样做..

谢谢!

最佳答案

$eq的简单用法返回 bool 值的运算符。另外$push将采用您扔给它的任何对象格式:

var senderId = // whatever;

mongooose.model("Message").aggregate([
    { "$match": {
        "conversation_id": { "$in": idArray },
        "created": { "$gt": lastChecked }
    }},
    { "$group": {
        "_id": "$conversation_id",
        "messages": {
            "$push": {
                "message": "$message",
                "is_self": { 
                    "$eq": [ "$sender", senderId ]
                }
            }
        }
    }}
    // whatever else
],function(err,results) {

})

如果需要,请与 $cond 结合使用仅在检测到时才交替添加“is_self”:

    { "$group": {
        "_id": "$conversation_id",
        "messages": {
            "$push": {
                "$cond": [
                  { "$eq": [ "$sender", senderId] },
                  {
                    "message": "$message",
                    "is_self": true
                  },
                  {
                     "messsage": "$message" 
                  }
                ]
            }
        }
    }}

关于node.js - Mongoose - 聚合添加 'is_self' 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31636636/

相关文章:

mongodb - DDD - 如何在 NoSql 数据库中存储聚合

node.js - 无法使用 mongoose 在 mongodb 中持久化对象数组

javascript - Mongoose 批量保存/异步更新每次只更新一些文档

node.js - SFTP 至 HP-不间断

javascript - 使用传递的 MongoDB 查询定位数组中的第一个对象

node.js - 在 Node js 应用程序中使用 Passport 进行身份验证

javascript - mongoose,如何查询对象数组中的最大值或最小值并返回对象

node.js - 如何在 Node js 中访问 laravel env 变量?

javascript - 将子 JSON 对象移动到其自己的具有父 ID 的对象

php - 如何在 MongoDB 中处理低于 1970 的日期