#mongodb
#mongodb
Вопрос:
есть ли какая-либо разница или преимущество между использованием $и для сопоставления нескольких значений для поля и использованием $match с $in?
db.collectionOne.aggregate([
{$match:{name:{'$in':['Jack','Jill']},
city:{'$in':['LA','NY']}
}
}])
или
db.collectionOne.aggregate([
{$match:{
$and:[{name:{'$in':['Jack','Jill']},
city:{'$in':['LA','NY']}
}
]}
}])
или $ и следует использовать только для числовых значений, чтобы повысить производительность?
Ответ №1:
Во-первых, я думаю, что в вашем примере есть опечатка. Это должно быть
db.collectionOne.aggregate([
{$match:{
$and:[{name:{'$in':['Jack','Jill']}},
{city:{'$in':['LA','NY']}
}
]}
}])
И оба используемых вами фрагмента совпадают с упомянутыми на этой странице
https://docs.mongodb.com/manual/reference/operator/query/and /
Примечание
MongoDB предоставляет неявную операцию И при указании списка выражений, разделенных запятыми. Использование явного И с оператором $and необходимо, когда одно и то же поле или оператор должны быть указаны в нескольких выражениях.
Поэтому используйте $и, когда вам нужно применить два условия к одному и тому же ключу, как показано ниже.
db.collectionOne.aggregate([
{$match:{
$and:[{name:{'$in':['Jack','Jill','Bill','Kill']}},
{name:{'$nin':['Matt','Bill']}
}
]}
}])
Приведенный выше пример не очень хорош, но он объясняет сценарий
Комментарии:
1. опечатки нет, но один и тот же запрос может использоваться обоими способами (мой и urs). Но я понимаю вашу точку зрения, что это не очень хороший пример. Не могу ли я просто использовать
db.collectionOne.aggregate([ {$match:{name:{'$in':['Jack','Jill','Bill','Kill']}, name:{'$nin':['Matt','Bill']} } }])
вместо использования $ и. Какая разница в производительности у этих двух?2. Я сказал опечатку, потому что $and предназначен для реализации нескольких условий в одном поле, как указано в моем ответе, но способ, который вы используете, неверен db.collectionOne.aggregate([ {$match:{ $and:[{name:{‘$in’:[‘Джек’,’Джилл’,’Билл’,’Убить’]}, имя:{‘$nin’:[‘Мэтт’,’Билл’]} } ]} }])
3. Я просмотрел ту же страницу, прежде чем спрашивать, и в документах больше смысла использовать $and для логического типа И операций. Но я видел, как многие люди используют $и вместо $match, даже когда нет операции логического типа для выполнения.