В MongoDB db.collection.find()
метод избира документи в колекция или изглед и връща курсор към избраните документи..
collection
част е името на колекцията или изгледа за търсене.
Можете да го използвате, за да върнете всички документи, само някои или само един документ. Можете също да посочите кои полета да бъдат върнати.
Важно е да се отбележи, че всъщност не връща документите. Той просто връща курсор към документите. Като каза това, по-лесно е да се каже, че „връща документи“ и обикновено се споменава по този начин – включително в тази статия 🙂
Връщане на всички документи
Ето пример за демонстрация.
db.pets.find()
Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }{ "_id" :3, "име" :"Мяу", "тип" :"Котка", "тегло" :7 }{ "_id" :4, "име" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }предварително>Тук използваме
find()
метод за връщане на всички документи отpets
колекция. Знаем, че това връща всички документи, защото не сме предоставили никакви критерии за филтриране. Всъщност не предоставихме никакви аргументи.Когато се извиква без аргументи,
find()
връща всички документи от колекция и връща всички полета за документите.Друг начин да направите горното е така:
db.pets.find({})
В този случай предаваме празен документ.
Като добавим към този празен документ, можем да започнем да филтрираме резултатите.
Филтрирайте резултатите
Действителният синтаксис на
find()
става така:db.collection.find(query, projection)
Това означава, че можете да подадете заявка като първи аргумент и проекция като втори.
Ако подадете заявка, тя се използва за филтриране на резултатите. Заявката е документ, който съдържа оператори на заявка. Както видяхме в предишния пример, празен документ връща всички документи.
Нека стесним резултатите до подмножество документи в колекцията.
db.pets.find({"type":"Dog"})
Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }Това стесни резултатите само до онези документи, които имат
type
поле със стойностDog
.В този случай просто сме предали документ като критерии за филтриране.
Можете също да използвате оператори на заявка. Те ви позволяват да приложите по-конкретни критерии към вашата заявка.
Пример:
db.pets.find({"weight": { $lt: 10 }})
Резултат:
{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Котка", "тегло" :8 }{ "_id" :5, "име" :"Брус", "тип" :"Прилеп", "тегло" :3 }Вградени документи
Ако имате документи, които съдържат вградени документи, можете да използвате следните методи за запитване на данни във вградените документи.
- Точкова нотация (напр.
field.nestedfield: <value>
) - Вложена форма (напр. {
field: { nestedfield: <value> } }
). Имайте предвид, че тази опция е достъпна само от MongoDB 4.4.
Да предположим, че вмъкваме следния документ.
db.pets.insertOne({ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, " цвят" :"кафяв" }})
Можем да използваме нотация с точки, за да правим заявки във вградения документ.
db.pets.find({ "specs.height": 400 })
Резултат:
{ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, "цвят" :"кафяв" } }
Следната заявка връща същия документ, с изключение на това, че този път препращаме към вградения документ, използвайки вложена форма.
db.pets.find({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
Резултат:
{ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, "цвят" :"кафяв" } }
Когато използвате вложения формуляр, заявката трябва да съвпада точно с целия вграден документ. Например следната заявка не съвпада:
db.pets.find({
"specs" : {
"height" : 400
}
})
Форматирайте резултатите
Резултатът от предишния пример беше върнат на един ред. Можете да използвате cursor.pretty()
метод за конфигуриране на курсора за показване на резултатите в по-четлив формат.
За да използвате pretty()
метод, добавете го към find()
метод.
Пример:
db.pets.find({ "_id": 6 }).pretty()
Резултат:
{ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, "цвят" :"кафяв" }}
Масиви
Можете да препращате данни в масиви, като препращате елемента от масива по неговия индекс или по неговата стойност.
Да предположим, че вмъкваме следния документ:
db.pets.insertOne({ "_id" :7, "name" :"Джейк", "type" :"Куче", "награди" :[ "Най-добро куче", "Най-добро куче", "Най-голямо куче" " ]})
Ако искаме да намерим всички кучета с наградата Top Dog, бихме могли да напишем следната заявка (която ще върне горното куче).
db.pets.find({
"awards": "Top Dog"
}).pretty()
Резултат:
{ "_id" :7, "name" :"Джейк", "type" :"Куче", "награди" :[ "Най-добро куче", "Най-добро куче", "Най-голямо куче" ]}
Можете също да посочите индекса на елемента, както следва:
db.pets.find({
"awards.0": "Top Dog"
}).pretty()
Това изисква посочената стойност да е в посочения индекс. Следователно следната заявка не връща същото куче.
db.pets.find({
"awards.1": "Top Dog"
}).pretty()
Обърнете внимание, че масивите са базирани на нула, така че индекс 0 определя първия елемент, 1 определя втория елемент и т.н.
Прожекции
По подразбиране всички полета на документа се връщат, когато използвате find()
. Но можете да използвате прогнози, за да намалите броя на върнатите полета, ако е необходимо.
Може би си спомняте, че синтаксисът за find()
става така:
db.collection.find(query, projection)
Където query
предоставя критериите за филтриране (които направихме в горните примери) и projection
е незадължителна проекция, която определя кои полета да се върнат от всички съвпадащи документи. Следователно, ако искаме да използваме проекция, просто я поставяме след заявката.
Когато използвате проекция, можете да посочите полетата за включване , полетата за изключване , или и двете. За да направите това, избройте името на полето и или 1
(за да го включите) или 0
(за да го изключите).
Към момента нашата колекция съдържа следните документи:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }{ "_id" :3, "име" :"Мяу", "тип" :"Котка", "тегло" :7 }{ "_id" :4, "име" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ " _id" :6, "име" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, "цвят" :"кафяв" } }{ "_id " :7, "name" :"Джейк", "тип" :"Куче", "награди" :[ "Най-добро куче", "Най-добро куче", "Най-голямо куче" ] }
Ето пример за използване на проекция, за да посочите полетата, които да включват:
db.pets.find({}, { name: 1, type: 1 })
Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog" }{ "_id" :2, "name" :"Laj", "type" :"Dog" }{ "_id" :3, "name" :"Мяу", "type" :"Cat" }{ "_id" :4, "name" :"Scratch", "type" :"Cat" }{ "_id" :5, "име" :"Брус", "тип" :"Прилеп" }{ "_id" :6, "име" :"Извличане", "тип" :"Куче" }{ "_id" :7, "име " :"Джейк", "тип" :"Куче" }
Забележете, че _id
полето се връща, въпреки че не сме го включили в нашата проекция. Това поле е изключение и е включено по подразбиране.
Ако не искате _id
поле, което трябва да бъде върнато, трябва изрично да го изключите.
db.pets.find({}, { _id: 0, name: 1, type: 1 })
Резултат:
{ "name" :"Wag", "type" :"Dog" }{ "name" :"Laj", "type" :"Dog" }{ "name" :"Meow", "type" :"Cat" }{ "name" :"Scratch", "type" :"Cat" }{ "name" :"Bruce", "type" :"Bat" }{ "name" :"Fetch", "type" :"Куче" }{ "име" :"Джейк", "тип" :"Куче" }
Ето още един пример, този път указваме само кои полета да изключим.
db.pets.find({}, { _id: 0, weight: 0, specs: 0, awards: 0 })
Резултат:
{ "name" :"Wag", "type" :"Dog" }{ "name" :"Laj", "type" :"Dog" }{ "name" :"Meow", "type" :"Cat" }{ "name" :"Scratch", "type" :"Cat" }{ "name" :"Bruce", "type" :"Bat" }{ "name" :"Fetch", "type" :"Куче" }{ "име" :"Джейк", "тип" :"Куче" }
Още прогнози
Има различни други неща, които можете да правите с прогнози. Например, като се започне от MongDB 4.4, можете да използвате агрегатни изрази, за да посочите стойността на проектирано поле.
Пример:
db.pets.find({}, {
"_id": 0,
"n": "$name",
"t": "$type",
"w": "$weight"
})
Резултат:
{ "n" :"Размахване", "t" :"Куче", "w" :20 }{ "n" :"Лаене", "t" :"Куче", "w" :10 }{ "n" :"Мяу", "t" :"Котка", "w" :7 }{ "n" :"Надраскване", "t" :"Котка", "w" :8 }{ "n" :"Брус", "t" :"Прилеп", "w" :3 }{ "n" :"Извличане", "t" :"Куче" }{ "n" :"Джейк", "t" :"Куче " }
Тук преименувахме имената на полетата. Направихме това, като посочихме ново име за всяко поле като низов литерал, като използвахме $fieldName
синтаксис за извеждане на стойността на полетата. Резултатът е малко като използването на псевдоними в SQL.
Повече информация
Вижте документацията на MongoDB за повече информация.