繁体   English   中英

什么是引用猫鼬模式objectId的更好方法

[英]Whats the better way to reference a mongoose schema 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'} } } }])

由于猫鼬不会将authorId转换为ObjectId,因此我没有得到任何注册表,我能够通过将其转换为ObjectId使其工作,然后再将其插入到过滤器中,但是它似乎不是一个很好的实现,因为我不得不要求猫鼬。

我以不同的方式实现了它,将authorId更改为String,它是否运行得很好,我的问题是是否有更好的方法来实现?

在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") }
>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM