Mongoose — Как мне найти конкретный документ, сопоставив элемент в массиве идентификаторов объектов в mongoose

#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. Какая схема в базе данных для ваших данных?

2. mongoosejs.com/docs/populate.html#saving-refs

Ответ №1:

В документах $elemMatch говорится:

Если вы указываете только одно условие в $elemMatch выражении и не используете операторы $not или $ne внутри $elemMatch , $elemMatch можно опустить.

И в запросе массива для элемента:

Чтобы запросить, содержит ли поле массива хотя бы один элемент с указанным значением, используйте фильтр { <поле>: <значение> }, где <значение> — значение элемента.

Итак, в вашем случае вы можете просто сделать:

 Account.find({investment: investment.id}).exec...
  

Ответ №2:

find Метод извлекает целые документы. Использование elemMatch в качестве оператора запроса определяет, какой документ выбран из коллекции. Это не изменяет содержимое массива вложенных документов.

Чтобы ограничить содержимое investment элемента массива, используйте elemMatch в качестве оператора проекции.