Как получить все значения, содержащие часть строки, используя поиск мангуста?

У меня есть следующая проблема: извлечение данных из MongoDB с помощью mongoose.

Вот моя схема:

const BookSchema = new Schema(
	{
		_id:Number,
		title:String,
		authors:[String],
		subjects:[String]	
	}
);

Ответы

Ответ 1

Ты почти ответил на это сам в своих тегах. У MongoDB есть оператор $regex, который позволяет отправлять регулярное выражение в виде запроса. Поэтому вы запрашиваете строки, содержащие "Alex", вы делаете это:

Books.find(
    { "authors": { "$regex": "Alex", "$options": "i" } },
    function(err,docs) { 
    } 
);

Вы также можете сделать это:

Books.find(
    { "authors": /Alex/i }, 
    function(err,docs) { 

    }
);

Оба действительны и отличаются от того, как вы пытались в правильном поддерживаемом синтаксисе, как показано в документации.

Но, конечно, если вы действительно спрашиваете "как получить результаты" массива "только для тех, которые соответствуют" Alex "где-то в строке?" то это немного другое.

Сложное сопоставление для элемента массива один является доменом структуры агрегации (или, возможно, mapReduce, но это намного медленнее), где вам нужно "фильтровать" содержимое массива.

Вы начинаете с того же самого. Ключевым моментом здесь является $unwind, чтобы "де-нормализовать" содержимое массива, чтобы быть "соответствующим образом" соответствующим образом документы. Затем перестройте массив с помощью "соответствующих" документов.

Books.aggregate(
    [
        // Match first to reduce documents to those where the array contains the match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Unwind to "de-normalize" the document per array element
        { "$unwind": "$authors" },

        // Now filter those document for the elements that match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Group back as an array with only the matching elements
        { "$group": {
            "_id": "$_id",
            "title": { "$first": "$title" },
            "authors": { "$push": "$authors" },
            "subjects": { "$first": "$subjects" }
        }}
    ],
    function(err,results) {

    }
)