我的聊天对象有一个包含两个元素的数组 - 用户 ID。我有来自 url 参数的第一个 id,但我有用户数组中的第二个 id。现在我想获取所有聊天,其中第一个 id 是来自 url 的这个,第二个是在数组中。我认为我尝试做的例子将是这个问题的最好解释:
Chat.find({
users: { $all: [req.params.id, { $in: usersIdArray }] }
})
其中 usersIdArray 例如:
[ 5f8777a01d8c122e74cb6f08, 5f8777721d8c122e74cb6f02 ]
它们是数字,而不是字符串。不知道重要不重要...
我现在遇到的错误:
(node:12168) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "{ '$in': [ 5f8777a01d8c122e74cb6f08, 5f8777721d8c122e74cb6f02 ] }" at path "users" for model "Chat"
还有我的聊天模式:
// Create schema
const ChatSchema = new Schema({
users: {
type: [{
type: Schema.Types.ObjectId,
ref: 'Users',
}, {
type: Schema.Types.ObjectId,
ref: 'Users',
}],
required: [true, 'Podaj uczestników czatu.'],
},
lastMessage: {
type: Schema.Types.ObjectId,
ref: 'Message'
}
}, { timestamps: opts });
最佳答案
由于数组的长度是固定的 (2),因此您可以只 query based on array position :
Chat.find({
"users.0": req.params.id,
"users.1": {$in: usersIdArray}
});
如果这不起作用,那么可能是因为 usersIdArray
实际上不是 ObjectId,在这种情况下您需要映射它们:
usersIdArray.map(x => ObjectId(x))
关于node.js - 通过 id 查找 mongoose 数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64419420/