mon go: как получить документ, точно соответствующий полю, тип которого является числом или массивом? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующая коллекция:

{ "_id" : ObjectId("5e4e3e068438c24cdec0eeb9"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eeba"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc", "efg" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebb"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : "0xmd5md5md5" }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebc"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123 ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebd"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : 123 }

Поле 'extraid' является числом или массивом, и когда я запускаю операцию ниже, возвращаемый результат не нужен:

> db.foo.find({"extraid": 123})
{ "_id" : ObjectId("5e4e3e068438c24cdec0eeb9"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eeba"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc", "efg" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebc"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123 ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebd"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : 123 }

Я думаю, что сопоставлен только один документ, это мой ожидаемый результат:

{ "_id" : ObjectId("5e4e3e078438c24cdec0eebd"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : 123 }

Я также пытаюсь запустить оператор $type, чтобы он мог точно соответствовать, но результат все еще не я want:

> db.foo.find({"extraid": {"$eq": 123, "$type":"int"}})
{ "_id" : ObjectId("5e4e3e068438c24cdec0eeb9"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eeba"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc", "efg" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebc"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123 ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebd"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : 123 }
> db.foo.find({"extraid": {"$eq": 123, "$type":"array"}})
{ "_id" : ObjectId("5e4e3e068438c24cdec0eeb9"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eeba"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123, "abc", "efg" ] }
{ "_id" : ObjectId("5e4e3e078438c24cdec0eebc"), "from" : "0xabsdfeeqwsfdasfafaefegr", "to" : "0xfdshshrtfafdfadfaete", "extraid" : [ 123 ] }
>

$type: array может соответствовать любому типу массива 'extraid', но $type: int не работает.

Итак, кто знает, как получить документ, точно соответствующий полю чей тип - число или массив?

1 Ответ

1 голос
/ 21 февраля 2020

Вы можете попробовать запрос ниже:

db.foo.find({$expr : {$and : [{$eq : ['int', {$type :'$extraid'}]}, {$eq : ["$extraid", 123]}]}})

Примечание: Проверьте данные в поле extraid, затем используйте double вместо int при необходимости.

Данные в сборе:

/* 1 */
{
    "_id" : ObjectId("5e4e3e068438c24cdec0eeb9"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : [ 
        123.0, 
        "abc"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e4e3e078438c24cdec0eeba"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : [ 
        123.0, 
        "abc", 
        "efg"
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e4e3e078438c24cdec0eebb"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : "0xmd5md5md5"
}

/* 4 */
{
    "_id" : ObjectId("5e4e3e078438c24cdec0eebc"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : [ 
        123.0
    ]
}

/* 5 */
{
    "_id" : ObjectId("5e4e3e078438c24cdec0eebd"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : 123
}

/* 6 */
{
    "_id" : ObjectId("5e4e3e078438c24cdec0ee11"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : 12301
}

Вывод:

{
    "_id" : ObjectId("5e4e3e078438c24cdec0eebd"),
    "from" : "0xabsdfeeqwsfdasfafaefegr",
    "to" : "0xfdshshrtfafdfadfaete",
    "extraid" : 123
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...