javascript - 什么是引用猫鼬模式 objectId 的更好方法
问题描述
假设我有以下模型:
var author = mongoose.Schema({
name: {
type: String,
required: true
},
isEnabled: {
type: Boolean,
required: true
}
})
var book = mongoose.Schema({
name: {
type: String,
required: true
},
value: {
type: Number,
required: true
}
authorId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'author'
required: true
},
isEnabled: {
type: Boolean,
required: true
}
})
当我尝试制作类似的聚合时,如下所示:
books.aggregate([{$match: { authorId: '599b3b54b8ffff5d1cd323d8'}, { $group: {_id: '$name', total: {$sum: '$value'} } } }])
由于 mongoose 没有将 authorId 转换为 ObjectId,我没有得到任何注册表,我能够通过在将其插入过滤器之前将其转换为 ObjectId 来使其工作,但它似乎不是一个好的实现,因为我不得不在猫鼬中提出要求。
我以不同的方式实现它,为 String 更改了 authorId,它是否工作得很好,我的问题是是否有更好的方法来做到这一点?
解决方案
使用 mongo4.0 及更高版本,您可以使用$convert更改数据类型,或者干脆$toObjectId
使用字符串 objectId 查找以查找 ObjectId
db.t10.find({$expr : {$eq : ["$_id" , {$convert : {input : "5c269af53f6a8103d9cda006", to : "objectId"}}]}})
总计的
db.t10.aggregate([
{$match : {$expr : {$eq : ["$_id" , {$convert : {input : "5c269af53f6a8103d9cda006", to : "objectId"}}]}}}
])
样品采集
> db.t10.find()
{ "_id" : ObjectId("5c269af53f6a8103d9cda006") }
总产出
> db.t10.aggregate([{$match : {$expr : {$eq : ["$_id" , {$convert : {input : "5c269af53f6a8103d9cda006", to : "objectId"}}]}}}])
{ "_id" : ObjectId("5c269af53f6a8103d9cda006") }
查找输出
> db.t10.find({$expr : {$eq : ["$_id" , {$convert : {input : "5c269af53f6a8103d9cda006", to : "objectId"}}]}})
{ "_id" : ObjectId("5c269af53f6a8103d9cda006") }
>
推荐阅读
- android - 如何添加自增ID?
- postgresql - pgcrypto 在日志中保持可见的私钥?
- django - 尝试优化管理站点时出现“模型块已注册”错误
- android - 当相机到达标记上方时,如何在谷歌地图 v.3 中打开标记的标题?
- css - 下拉导航栏与粘性导航栏?
- android - 多次刷新令牌发生
- bash - 如何以“(”作为用户输入开始,而不必在整个等式周围键入转义符号或引号?
- reactjs - 为什么 create-react-app 会同时创建 App.js 和 index.js?
- asp.net-core - .net core 2 中 fuslogvw 的替代品是什么?
- jquery - 页面加载后淡入按钮