#node.js #mongodb #mongoose
#node.js #mongodb #мангуст
Вопрос:
У меня есть схема Mongoose следующим образом:
var accountSchema = new mongoose.Schema({
accountName: String,
accountType: { type: String, default: 'Individual Account' },
accountNumber: { type: String, unique: true },
accountActive: Boolean,
investment: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Investment'
}
]
})
module.exports = mongoose.model('Account', accountSchema);
И я хотел бы найти Account
документ, который имеет определенный object id
в инвестиционном массиве.
"investment": [
{
"$oid": "5f353184c2daaf0f5c661ea7"
},
{
"$oid": "5f3531acc2daaf0f5c661ea9"
},
{
"$oid": "5f366e873d566938f81b94a8"
},
]
Я пробовал приведенный ниже код, но я продолжаю получать пустой массив:
Account.find().elemMatch('investment', { id: investment.id }).exec(function(err, account){
console.log(account)
});
Что я делаю не так? Я ожидал, что elemMatch будет работать в соответствии с документом mongoose. При отладке я вижу, что код правильно переведен в mongodb.
accounts find {"investment":{"$elemMatch":{"id":"5f3531acc2daaf0f5c661ea9"}}} {"projection":{}}
Кто-нибудь может мне здесь помочь, пожалуйста.
Комментарии:
1. Какая схема в базе данных для ваших данных?
Ответ №1:
В документах $elemMatch говорится:
Если вы указываете только одно условие в
$elemMatch
выражении и не используете операторы$not
или$ne
внутри$elemMatch
,$elemMatch
можно опустить.
И в запросе массива для элемента:
Чтобы запросить, содержит ли поле массива хотя бы один элемент с указанным значением, используйте фильтр { <поле>: <значение> }, где <значение> — значение элемента.
Итак, в вашем случае вы можете просто сделать:
Account.find({investment: investment.id}).exec...
Ответ №2:
find
Метод извлекает целые документы. Использование elemMatch в качестве оператора запроса определяет, какой документ выбран из коллекции. Это не изменяет содержимое массива вложенных документов.
Чтобы ограничить содержимое investment
элемента массива, используйте elemMatch в качестве оператора проекции.