regex поиск целого числа в агрегированном запросе mongodb? [Дубликат]

провести круглый прямоугольник с закругленными углами слева

  private void drawRoundRect(float left, float top, float right, float bottom, Paint paint, Canvas canvas) {
        Path path = new Path();
        path.moveTo(left, top);
        path.lineTo(right, top);
        path.lineTo(right, bottom);
        path.lineTo(left + radius, bottom);
        path.quadTo(left, bottom, left, bottom - radius);
        path.lineTo(left, top + radius);
        path.quadTo(left, top, left + radius, top);
        canvas.drawPath(path, onlinePaint);
    }
15
задан styvane 30 July 2016 в 09:12
поделиться

2 ответа

Если вы хотите выполнить сопоставление шаблонов по номерам, способ сделать это в mongo - использовать выражение $ where и передать совпадение шаблона.

> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }
37
ответ дан dalton 18 August 2018 в 21:13
поделиться
  • 1
    Как не связанный совет, чтобы сделать эту работу на PHP, вам нужно передать массив ('$ where' = & gt; новый MongoCode (/ ^ 123. * /. Test (this.example) & quot;); – Gary Richardson 28 May 2010 в 01:37
  • 2
    @dalton Просто интересно, не будет ли оператор $ regex более эффективным, чем $ где? – talentedmrjones 17 October 2011 в 21:32
  • 3
    Понял, что что-то подобное применимо к драйверу Ruby, как отметил @gary, но нет. Это должно работать как charm db.test.find (& quot; $ where & quot; = & gt; "/ ^ 123. * /. Test (this.example)") – Vivek 22 August 2012 в 19:41
  • 4
    Это было бы ужасно неэффективно, не так ли? – Andrew Mao 6 March 2014 в 21:24
  • 5
    @talentedmrjones, есть упоминание об этом в jira.mongodb.org/browse/SERVER-1174 : «Мы подумали об этом, но не думайте, что разрешить регулярное выражение для нестроковых полей - отличный идея. Это будет очень медленно, и это вводит в заблуждение. & Quot; – russellfeeed 7 May 2014 в 14:06

Я не большой поклонник использования оператора запроса $where из-за того, как он оценивает выражение запроса и риск безопасности, если запрос использует пользовательские входные данные.

Как сказано, лучший способ сделать это - $project ваш документ и добавить другое вычисленное поле, которое является строковым значением вашего номера.

Операторы $toLower и его sibling $toUpper соответственно преобразуют строку в строчную и прописную, но имеют немного неизвестную функцию, они могут использоваться для преобразования целого в строку.

Оператор $match возвращает все те документы, которые соответствуют вашему шаблону, с помощью оператора $regex .

db.seDemo.aggregate(
    [ 
        { "$project": { 
            "stringifyExample": { "$toLower": "$example" }, 
            "example": 1 
        }}, 
        { "$match": { "stringifyExample": /^123.*/ } }
    ]
)

, который дает:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234,
    "stringifyExample" : "1234"
}

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334,
    "stringifyExample" : "12334"
}

Теперь, если вы хотите получить весь документ, который содержит определенную подстроку, более простой и лучший способ сделать это в предстоящем выпуске MongoDB (начиная с этой записи) с использованием оператора $redact , который позволяет обрабатывать логическую $cond . $indexOfCP.

db.seDemo.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$gt": [ 
                { "$indexOfCP": [ 
                    { "$toLower": "$example" }, 
                    "123" 
                ] }, 
                -1 
            ] }, 
            "$$KEEP", 
            "$$PRUNE" 
        ] 
    }}
])

, который производит:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234 
}

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334 
}
4
ответ дан styvane 18 August 2018 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: