Какой лучший способ ссылаться на objectId схемы Мангуста

1

Предполагая, что у меня есть следующие модели:

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 перед вставкой в фильтр, но это не выглядело как хорошая реализация, так как Я должен был дать требование в мангуст.

Я реализовал это по-другому, изменил authorId для String, он работал очень хорошо, мой вопрос: есть ли лучший способ сделать это?

Теги:
mongoose

1 ответ

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") }
>
  • 0
    Это решение очень хорошее, хотя в моем случае мне пришлось сохранить его как String, поскольку этот параметр недоступен в базе данных, как вы сами указали, как можно скорее я обновлю базу данных и внедрю это решение, большое спасибо за ваш ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню