typescript - 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 个结果。我也尝试使用aggregate
which 也返回两个结果。结果:
{
"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"
}
]
}
我在某个地方犯了错误吗?你能帮我吗?先感谢您!
解决方案
我为这个问题找到了另一种解决方案,我认为它可能会对某人有所帮助。我不能用.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
}
}
])
推荐阅读
- css - 如何克服 CSS calc() 函数无效的属性值,但在检查器中输入相同的代码时是否有效?
- java - 从 Volley 请求中获取返回值
- mysql - 在 MYSQL 中保存具有不同数据类型的测验答案的最佳做法是什么?
- java - 带有 H2 DB 的 JPA EntityManager.lock - java.sql.SQLException:当多个事务对同一实体使用锁定时,连接已关闭
- node.js - $merge 只保存一个文档而不是所有获取的文档:mongodb
- python - 如何为使用附加参数的 tf.keras 创建自己的损失函数?
- javascript - 使用 JavaScript 禁用/启用“保存按钮”
- python - 如何使用 seaborn 为每个数据列设置绘图样式来绘制分类数据?
- android - can't show image in my gridView by adding glide
- python-3.x - 无法使用 python3 的键盘模块删除热键