В MongoDB db.collection.findOne()
метод връща един документ, който отговаря на посочените критерии за заявка в колекцията или изгледа.
collection
част е името на колекцията или изгледа за търсене.
findOne()
е подобен на find()
, с изключение на това findOne()
връща само първия документ, който отговаря на критериите за филтриране, според естествения ред, който отразява реда на документите на диска.
find()
от друга страна, връща всички съвпадащи документи.
Също така, findOne()
връща действителния документ, докато find()
връща само курсор към всеки документ. Следователно не можете да приложите методите на курсора към findOne()
както можете с find()
.
Пример
Да предположим, че имаме колекция, наречена pets
със следните документи:
{ "_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 }предварително>Можем да използваме
findOne()
за да върнете един документ.db.pets.findOne()
Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }Тук претърсихме всички документи в
pets
колекция. Знаем, че това претърси всички документи, защото не предоставихме никакви критерии за филтриране. Дори не предоставихме никакви аргументи.Когато се извиква без аргументи,
findOne()
търси всички документи от колекция и връща всички полета за съответстващия документ.Друг начин да направите горното е така:
db.pets.findOne({})
В този случай предаваме празен документ.
Като добавим към този празен документ, можем да започнем да филтрираме резултатите.
Оставете заявка
Действителният синтаксис на
findOne()
става така:db.collection.findOne(query, projection)
Това означава, че можете да подадете заявка като първи аргумент и проекция като втори.
Ако подадете заявка, тя се използва за филтриране на обхвата на търсенето само до онези документи, които съответстват на заявката. Заявката е документ, който съдържа оператори на заявка. Както видяхме в предишния пример, празен документ връща всички документи.
Нека стесним резултатите до подмножество документи в колекцията.
db.pets.findOne({"type":"Cat"})
Резултат:
{ "_id" :3, "name" :"Мяу", "type" :"Котка", "тегло" :7 }Това стесни търсенето само до онези документи, които имат
type
поле със стойностCat
, след товаfindOne()
върна първия документ от този резултат.В този случай просто сме предали документ като критерии за филтриране.
Можете също да използвате оператори на заявка. Те ви позволяват да приложите по-конкретни критерии към вашата заявка.
Пример:
db.pets.findOne({"weight": { $lt: 10 }})
Резултат:
{ "_id" :3, "name" :"Мяу", "type" :"Котка", "тегло" :7 }Вградени документи
Ако имате документи, които съдържат вградени документи, можете да използвате следните методи за запитване на данни във вградените документи.
- Точкова нотация (напр.
field.nestedfield: <value>
) - Вложена форма (напр. {
field: { nestedfield: <value> } }
). Имайте предвид, че тази опция е достъпна само от MongoDB 4.4.
Да предположим, че вмъкваме следния документ.
db.pets.insertOne({ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, " цвят" :"кафяв" }})
Можем да използваме нотация с точки, за да правим заявки във вградения документ.
db.pets.findOne({ "specs.height": 400 })
Резултат:
{ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, "цвят" :"кафяв" }}
Следната заявка връща същия документ, с изключение на това, че този път препращаме към вградения документ, използвайки вложена форма.
db.pets.findOne({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
Резултат:
{ "_id" :6, "name" :"Извличане", "тип" :"Куче", "спецификации" :{ "височина" :400, "тегло" :15, "цвят" :"кафяв" }}
Когато използвате вложения формуляр, заявката трябва да съвпада точно с целия вграден документ. Например следната заявка не съвпада:
db.pets.findOne({
"specs" : {
"height" : 400
}
})
Резултат:
нула
Масиви
Можете да препращате данни в масиви, като препращате елемента от масива по неговия индекс или по неговата стойност.
Да предположим, че вмъкваме следния документ:
db.pets.insertOne({ "_id" :7, "name" :"Джейк", "type" :"Куче", "награди" :[ "Най-добро куче", "Най-добро куче", "Най-голямо куче" " ]})
Ако искаме да намерим всички кучета с наградата Top Dog, бихме могли да напишем следната заявка (която ще върне горното куче).
db.pets.findOne({
"awards": "Top Dog"
})
Резултат:
{ "_id" :7, "name" :"Джейк", "type" :"Куче", "награди" :[ "Най-добро куче", "Най-добро куче", "Най-голямо куче" ]}
Можете също да посочите индекса на елемента, както следва:
db.pets.findOne({
"awards.0": "Top Dog"
})
Това изисква посочената стойност да е в посочения индекс. Следователно следната заявка не връща същото куче.
db.pets.findOne({
"awards.1": "Top Dog"
})
Обърнете внимание, че масивите са базирани на нула, така че индекс 0 определя първия елемент, 1 определя втория елемент и т.н.
Прожекции
По подразбиране всички полета на документа се връщат, когато използвате findOne()
. Но можете да използвате прогнози, за да намалите броя на върнатите полета, ако е необходимо.
Може би си спомняте, че синтаксисът за findOne()
става така:
db.collection.findOne(query, projection)
Където query
предоставя критериите за филтриране (които направихме в горните примери) и projection
е незадължителна проекция, която определя кои полета да се върнат от всички съвпадащи документи. Следователно, ако искаме да използваме проекция, просто я поставяме след заявката.
Когато използвате проекция, можете да посочите полетата за включване , полетата за изключване , или и двете. За да направите това, избройте името на полето и или 1
(за да го включите) или 0
(за да го изключите).
Ето пример за използване на проекция, за да посочите полетата, които да включват:
db.pets.findOne({}, { name: 1, type: 1 })
Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog" }
Забележете, че _id
полето се връща, въпреки че не сме го включили в нашата проекция. Това поле е изключение и е включено по подразбиране.
Ако не искате _id
поле, което трябва да бъде върнато, трябва изрично да го изключите.
db.pets.findOne({}, { _id: 0, name: 1, type: 1 })
Резултат:
{ "name" :"Wag", "type" :"Dog" }
Ето още един пример, този път указваме само кои полета да изключим.
db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 })
Резултат:
{ "name" :"Wag", "type" :"Dog" }
Още прогнози
Има различни други неща, които можете да правите с прогнози. Например, като се започне от MongDB 4.4, можете да използвате агрегатни изрази, за да посочите стойността на проектирано поле.
Пример:
db.pets.findOne({}, {
"_id": 0,
"n": "$name",
"t": "$type",
"w": "$weight"
})
Резултат:
{ "n" :"Размахване", "t" :"Куче", "w" :20 }
Тук преименувахме имената на полетата. Направихме това, като посочихме ново име за всяко поле като низов литерал, като използвахме $fieldName
синтаксис за извеждане на стойността на полетата. Резултатът е малко като използването на псевдоними в SQL.
Повече информация
Вижте документацията на MongoDB за повече информация.