Команда Mongo для фильтрации поля по его длине

У меня есть коллекция монго, в которой я пытаюсь отфильтровать все записи с определенным полем длины = 1.

Я пытаюсь использовать команду ниже, и это дало ошибку ниже, может кто-нибудь помочь здесь

db.getCollection('accdetails').find({$where:"bankDetails.length = 1"}).sort({$natural:-1})

Ниже ошибка

Error: error: {
"ok" : 0,
"errmsg" : "ReferenceError: bankDetails is not defined :\n_funcs5@:1:24\n",
"code" : 139
}

Но у меня есть поле bankDetails в моем объекте

** РЕДАКТИРОВАТЬ, чтобы быть более точным * Ниже моя запись

{
"id" : "123",
"bankDetails" : {
    "bankdata" : {
        "banknum" : {}

    },
    "accountdata" : {
        "accnum" : {}

    }

}
}

Для некоторых записей данные учетной записи отсутствуют, поэтому я хочу просмотреть записи, в которых нет объекта данных учетной записи в записи.

Как я могу запросить?


person hammy    schedule 10.01.2018    source источник


Ответы (1)


$where — это обычный оператор JavaScript, поэтому для сравнения значений следует использовать двойной знак равенства:

db.getCollection('accdetails').find({$where:"this.bankDetails.length == 1"}).sort({$natural:-1})

Также вам необходимо сослаться на текущий документ, используя this.

Вы также можете использовать $size, что в этом случае будет быстрее. , потому что для $where MongoDB необходимо обработать ваше выражение JavaScript (документы), поэтому его следует по возможности избегать:

db.getCollection('accdetails').find({ bankDetails: { $size: 1 } }).sort({$natural:-1})

РЕДАКТИРОВАТЬ:

Если вы хотите получить bankDetails только там, где отсутствует accountData, вы должны использовать $exists оператор:

db.getCollection('accdetails').find({ 'bankDetails.accountdata': { $exists: false } }).sort({$natural:-1})
person mickl    schedule 10.01.2018
comment
Спасибо. Микл, это не сработало в моем случае. Извините, может быть, я неправильно отформатировал вопрос. Я добавил свой пример записи и задал вопрос в деталях. Можете ли вы взглянуть - person hammy; 10.01.2018
comment
@hammy, я изменил свой ответ, попробуйте с оператором $exists - person mickl; 10.01.2018
comment
Спасибо. Это сработало. Последняя помощь, что делать, если мне нужно найти записи, в которых существуют оба идентификатора, а данные bankDetails.accountdata не существуют? - person hammy; 10.01.2018
comment
.find({'bankDetails.accountdata': {$exists: false}, 'id': {$exists: true}}) - person mickl; 10.01.2018