Сравнение двух полей в MongoDb - PullRequest
1 голос
/ 18 марта 2019

Я новичок в MongoDB и пытаюсь сравнить 2 поля в коллекции в MongoDB.

Поля: атрибуты (объект) и коллекции (массив)

{ 
    "_id" : ObjectId("55ae1e47309ffcbd1b67bd6c"), 
    "collections" : [
        {
            "collection_code" : "9TEST", 
            "_id" : ObjectId("5c76eee4bb4afe3a3603eeb3")
        }
    ], 
   "attributes" : {
        "collection_code" : "9TEST"
    }
}

Мой запрос

db.companies.find({ $where : "this.attributes.collection_code == this.collections[collection_code]" })

Ошибка при получении ниже

{
    "message" : "TypeError: Cannot read property 'collection_code' of undefined" +
              "at _funcs1 (_funcs1:1:45) near 'on_code == this.collections[collection_co' ",
    "$err" : "TypeError: Cannot read property 'collection_code' of undefined" +
              "at _funcs1 (_funcs1:1:45) near 'on_code == this.collections[collection_co' ",
    "code" : 16722,
    "name" : "MongoError"
}

Любая помощь высоко ценится. Заранее спасибо.

1 Ответ

1 голос
/ 18 марта 2019

Вам нужно $ expr , чтобы сравнить два поля в MongoDB.Поскольку у вас есть массив (collection), и вы хотите проверить, есть ли какой-либо элемент, с которым совпадают поля, вы можете использовать $ map с $ anyElementTrue операторами, как показано ниже:

db.col.find({
    $expr: {
        $anyElementTrue: {
            $map: {
                input: "$collections",
                in: {
                    $eq: [ "$$this.collection_code", "$attributes.collection_code" ]
                }
            }
        }
    }
})

Существует также более лаконичный способ, используя $ в операторе

db.col.find({
    $expr: {
        $in: [ "$attributes.collection_code", "$collections.collection_code" ]
    }
})

, это работает, потому что collections.collection_code представляет массив строк в этом случае.

РЕДАКТИРОВАТЬ: В качестве обходного пути для версии 3.0 вы можете использовать $anyElementTrue с $ redact :

db.col.aggregate([
    { $redact: {
        $cond: {
        if: {$anyElementTrue: { $map: { input: "$collections", as: "c", in: { $eq: [ "$$c.collection_code", "$attributes.collection_code" ]  }  }}},
        then: "$$KEEP",
        else: "$$PRUNE"
        }
    }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...