db.getCollection('docs').aggregate([
{
$project: {
"has books" :
{ $in: ["A", {$cond: {if: {$gt: ["$books", null]}, then: "$books", else: []}}] }
}
}
])
Приведенный выше запрос работает при выполнении на автономной базе данных MongoDB и дает следующий результат:
/* 1 */
{
"_id" : ObjectId("5ca6023ccb9228c0ab417ad5"),
"has books" : false
}
/* 2 */
{
"_id" : ObjectId("5ca631b8cb9228c0ab419174"),
"has books" : false
}
/* 3 */
{
"_id" : ObjectId("5ca64006cb9228c0ab419a54"),
"has books" : false
}
/* 4 */
{
"_id" : ObjectId("5ca6e093cb9228c0ab41cf7c"),
"has books" : true
}
/* 5 */
{
"_id" : ObjectId("5ca6eee9cb9228c0ab41d594"),
"has books" : false
}
Однако при выполнении того же запроса на экземпляре AWS DocumentDB выдается следующая ошибка:
Failed to execute script.
Error: command failed: {
"ok" : 0,
"errmsg" : "$in requires an array as a second argument, found: object",
"code" : 40081
} : aggregate failed
Details:
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:534:17
assert.commandWorked@src/mongo/shell/assert.js:618:16
DB.prototype._runAggregate@src/mongo/shell/db.js:260:9
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1062:12
DBCollection.prototype.aggregate@:1:355
@(shell):1:1
Цель запроса - проверить, присутствует ли конкретное значение в массиве или нет, с ожидаемым выводом как логическим. Коллекцияdocs
имеет массив field = books
, который может быть нулевым, поэтому для преодоления проблемы с нулевым значением $cond
используется для замены поля books
пустым массивом, если поле не существует или имеет значение NULL. $ifNull
не поддерживается AWS DocumentDB, поэтому его нельзя использовать.
Предложения по исправлению вышеуказанного запроса или использованию альтернативного запроса, который будет поддерживаться AWS DocumentDB для получения ожидаемого результата, окажут огромную помощь.
$gt
на$ne
? - person Tom Slabbaert   schedule 11.06.2020$ne
- person Ritu Raut   schedule 11.06.2020undefined
! ==null
. - person Tom Slabbaert   schedule 11.06.2020books: {$exits: false}
? - person Tom Slabbaert   schedule 11.06.2020book
являются массивами типов. используйте$type
для этого. - person Tom Slabbaert   schedule 11.06.2020books: {$exits: false}
я получил документы, в которых не было поля, и я также проверил с{books: {$type: 6}
, который дал мне 0 документов. - person Ritu Raut   schedule 11.06.2020{$exists: false}
, значит, в этом проблема. напишу ответ с решением как его обойти \ - person Tom Slabbaert   schedule 11.06.2020