node.js - 通过 id 查找 mongoose 数组中的对象

标签 node.js mongodb mongoose

我的聊天对象有一个包含两个元素的数组 - 用户 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/

相关文章:

javascript - 将查询从 react 前端传递到羽毛服务是好的做法吗?

node.js - 使用 mongoose 获取子文档的 Node api

node.js - Node 设置和安装

javascript - 如何取消设置 iso dateTime 日期格式的时间属性

mongodb - elasticsearch:_id字段的特殊行为?

mongodb - 无法在 Ubuntu 11.04 上重新启动 mongodb

mongodb - 聚合符合条件的子文档计数并分组

javascript - Moment 将日期转换为查找查询的字符串和聚合查询的对象。如何以及为什么?

html - 如何遍历超市网站并获取产品名称和价格?

node.js - 使用 AWS Lambda 函数和 Node.js 从 S3 存储桶中提取 zip 文件并上传到另一个存储桶