假设我具有以下模型:
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使其工作,然后再将其插入到过滤器中,但看起来并不好实施,因为我不得不用猫鼬提出要求。
我以不同的方式实现了它,更改了String的authorId,效果是否很好,我的问题是是否有更好的方法来实现?
答案 0 :(得分:0)
在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") }
>