首页 > 解决方案 > Mongoose - 从子文档中查找无法正常工作

问题描述

我有以下收藏。它有以下信息。

/* 1 */
{
    "_id" : ObjectId("613f2b9debb62a2ab97fad2f"),
    "is_active" : true,
    "is_deleted" : false,
    "user_id" : ObjectId("610cde79c91888645aa845d4"),
    "title" : "Hello World",
    "questions" : [ 
        {
            "is_read" : true,
            "_id" : ObjectId("613f2b9debb62a2ab97fad30"),
            "message" : "Hello",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-13T10:44:45.608Z")
        }, 
        {
            "is_read" : true,
            "_id" : ObjectId("613f2babebb62a2ab97fad31"),
            "message" : "Assalomu alaykum",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-13T10:44:59.599Z")
        }, 
        {
            "is_read" : true,
            "_id" : ObjectId("61403be6ebb62a2ab97fad35"),
            "message" : "123",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:06:30.042Z")
        }, 
        {
            "is_read" : true,
            "_id" : ObjectId("61403be7ebb62a2ab97fad36"),
            "message" : "123",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:06:31.655Z")
        }, 
        {
            "is_read" : true,
            "_id" : ObjectId("61403be8ebb62a2ab97fad37"),
            "message" : "321",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:06:32.776Z")
        }, 
        {
            "is_read" : true,
            "_id" : ObjectId("61403bffebb62a2ab97fad38"),
            "message" : "222",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:06:55.609Z")
        }, 
        {
            "is_read" : true,
            "_id" : ObjectId("614040640e6ebf89cc25ddd7"),
            "message" : "12351222223",
            "user_id" : ObjectId("5fcdce3231f17c355c1d487b"),
            "createdAt" : ISODate("2021-09-14T06:25:40.081Z")
        }, 
        {
            "is_read" : false,
            "_id" : ObjectId("614040950e6ebf89cc25ddd8"),
            "message" : "ssss",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:26:29.598Z")
        }, 
        {
            "is_read" : false,
            "_id" : ObjectId("614040980e6ebf89cc25ddd9"),
            "message" : "asdasd",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:26:32.301Z")
        }, 
        {
            "is_read" : false,
            "_id" : ObjectId("6140409d0e6ebf89cc25ddda"),
            "message" : "asdwad",
            "user_id" : ObjectId("610cde79c91888645aa845d4"),
            "createdAt" : ISODate("2021-09-14T06:26:37.602Z")
        }
    ],
    "createdAt" : ISODate("2021-09-13T10:44:45.623Z"),
    "updatedAt" : ISODate("2021-09-14T06:26:37.603Z"),
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("61403553ebb62a2ab97fad33"),
    "is_active" : true,
    "is_deleted" : false,
    "user_id" : ObjectId("60ab4e0ed23b2432acd250d1"),
    "title" : "Test Support",
    "questions" : [ 
        {
            "is_read" : false,
            "_id" : ObjectId("61403553ebb62a2ab97fad34"),
            "message" : "Test xabar oz'gardi",
            "user_id" : ObjectId("60ab4e0ed23b2432acd250d1"),
            "createdAt" : ISODate("2021-09-14T05:38:27.835Z")
        }
    ],
    "createdAt" : ISODate("2021-09-14T05:38:27.852Z"),
    "updatedAt" : ISODate("2021-09-14T05:38:27.852Z"),
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("614044460e6ebf89cc25dddb"),
    "is_active" : true,
    "is_deleted" : false,
    "user_id" : ObjectId("60ab4e0ed23b2432acd250d1"),
    "title" : "Test Support 2",
    "questions" : [ 
        {
            "is_read" : false,
            "_id" : ObjectId("614044460e6ebf89cc25dddc"),
            "message" : "Test xabar oz'gardi",
            "user_id" : ObjectId("60ab4e0ed23b2432acd250d1"),
            "createdAt" : ISODate("2021-09-14T06:42:14.892Z")
        }
    ],
    "createdAt" : ISODate("2021-09-14T06:42:14.901Z"),
    "updatedAt" : ISODate("2021-09-14T06:42:14.901Z"),
    "__v" : 0
}

现在我需要获取所有未读消息室。即如果在创建的房间中有消息发送给我,则必须返回该消息所在的房间信息。. 比我有以下查询:

const data = {
            is_active: isActive, // true or false
            is_deleted: isDeleted, // true or false
            "questions.is_read": { $eq: isRead }, // true or false
            "questions.user_id": { $ne: mongoose.Types.ObjectId( id ) }, // Requested users' id
        }
 SupportModel.find( data,
            { title: 1, user_id: 1 } )
            // .populate( {
            //     path: 'questions',
            //     select: [`message`, '_id']
            //     //options: { limit: 1, sort: { created: -1 } },
            //     //select: 'is_read message',
            //     //match: { user_id: { $ne: mongoose.Types.ObjectId( id ) }, is_read: { $eq: isRead } },
            // } )
            .populate( {
                path: 'user_id',
                select: [`first_name`, 'last_name', '_id']
            } )
            .exec( function ( err, data ) { ...

此查询当前正在运行。但有两个结果回来了。事实上,应该返回 3 个结果。我也尝试使用aggregatewhich 也返回两个结果。结果:

{
    "status": "Success",
    "data": [
        {
            "_id": "61403553ebb62a2ab97fad33",
            "user_id": {
                "_id": "60ab4e0ed23b2432acd250d1",
                "last_name": "Test",
                "first_name": "User 1",
                "id": "60ab4e0ed23b2432acd250d1"
            },
            "title": "Test Support"
        },
        {
            "_id": "614044460e6ebf89cc25dddb",
            "user_id": {
                "_id": "60ab4e0ed23b2432acd250d1",
                "last_name": "Test",
                "first_name": "User 1,
                "id": "60ab4e0ed23b2432acd250d1"
            },
            "title": "Test Support 2"
        }
    ]
}

我在某个地方犯了错误吗?你能帮我吗?先感谢您!

标签: typescriptmongodbmongoose

解决方案


我为这个问题找到了另一种解决方案,我认为它可能会对某人有所帮助。我不能用.find()查询来做,我用了aggregate函数。

Model.aggregate([
            {
                $match: {
                    is_active: isActive,
                    is_deleted: isDeleted,
                    questions: {
                        $elemMatch: data
                    }
                },
            },
            { $lookup: { from: 'users', localField: 'user_id', foreignField: '_id', as: 'user' } },
            { $unwind: { path: "$user", preserveNullAndEmptyArrays: true } },
            {
                $project: {
                    user: {
                        first_name: 1,
                        last_name: 1
                    },
                    title: 1
                }
            }
        ])

推荐阅读