Mongoose - exec işlevi ne yapar?


103

FindOne sorgusu ve ardından exec () işlevi içeren bir Mongoose kod parçasıyla karşılaştım.

Bu yöntemi daha önce Javascript'te görmedim mi? Tam olarak ne yapar?

Yanıtlar:


151

Temel olarak firavun faresi kullanılırken, belgeler yardımcılar kullanılarak alınabilir. Sorgu koşullarını kabul eden her model yöntemi, a callbackveya execyöntemiyle çalıştırılabilir.

callback:

User.findOne({ name: 'daniel' }, function (err, user) {
  //
});

exec:

User
  .findOne({ name: 'daniel' })
  .exec(function (err, user) {
      //
  });

Bu nedenle, bir geri aramayı iletmediğinizde, bir sorgu oluşturabilir ve sonunda onu çalıştırabilirsiniz.

Daha fazla bilgiyi firavun faresi belgelerinde bulabilirsiniz .

GÜNCELLEME

Promises'i Mongoose async işlemleriyle birlikte kullanırken dikkat edilmesi gereken bir nokta, Mongoose sorgularının Promises olmadığıdır . Sorgular bir anahtar döndürür , ancak gerçek bir Söze ihtiyacınız varsa , execyöntemi kullanmalısınız . Daha fazla bilgiyi burada bulabilirsiniz .

Güncelleme sırasında soruyu açıkça cevaplamadığımı fark ettim:

Bu yöntemi daha önce Javascript'te görmedim mi? Tam olarak ne yapar?

Eh öyle değil bir yerli JavaScript yöntemi, ancak Gelincik API parçası.


4
Ya mongoose.Promise = required ('bluebird') ayarladıysam, yine de .exec () kullanmam gerekir mi? Teşekkürler.
wayofthefuture

4
@wayofthefuture Bu konuyla ilgili dokümanları gerçekten kafa karıştırıcı buluyorum, ancak yine de execyöntemi aramanız gerektiğine inanıyorum . En azından belgelerde yaptıkları bu. Kendinizi kontrol edebileceğinizden emin olmak için Model.find() instanceof require('bluebird'). Bu yardımcı olur umarım.
danillouz

1
Ve sonra, silme ve insertMany gibi diğer işlemler sorusu var ... bu durumlarda exec () gerekli olur mu? Silme, kaputun altında bir tür sorgu kullanmak zorunda kalacak ...
wayofthefuture

1
exec ayrıca geri arama yapılmazsa bir söz verir ki bu çok uygun bir durumdur
Alexander Mills

Birini kurtarabilir . Model.update () işlevinin işini yapacağını düşünüyorsanız ve çok önemli olmayan bazı verilerin güncellenmesini ve API'ye yanıt vermesini beklemiyorsanız; Güncellemeniz çalışmayacak. Buna gerek Model.update().exec()emin çalıştırır yapmak. Ardından, güncelleme beklemeden api'ye yanıt verebilirsiniz.
Yogesh

52

Daniel bunu çok güzel cevapladı. Sorgu oluşturma ve yürütme yollarının kapsamlı bir listesini geliştirmek için aşağıdaki kullanım durumlarına bakın:

Sorgu Oluşturma

Gelincik kadar bir sorgu yürütmez thenveya execbunun üzerine adı olmuştur. Bu, karmaşık sorgular oluştururken çok kullanışlıdır. Bazı örnekler, populateve aggregateişlevlerinin kullanımını içerebilir .

User.find({name: 'John'}) // Will not execute

Geri arama yoluyla yürütme

İç içe geçmiş doğası nedeniyle birçok kişi tarafından beğenilmese de, sorgular isteğe bağlı geri arama sağlanarak yürütülebilir.

User.find({name: 'John'}, (err, res) => {}) // Will execute

Sonra bir Söz / A + olarak API

Mongoose sorguları bir thenişlev sağlar. Bu, düzenli sözlerle karıştırılmamalıdır. Basitçe söylemek gerekirse, Promises / A + spesifikasyonu, thensözlere alışkın olduğumuz gibi çalışması için bir işlev gerektirir .

User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel

Exec işlevi

Mongoose belgelerinden If you need a fully-fledged promise, use the .exec() function.

User.find({name: 'John'}).exec(); // Will execute returning a promise

1
Dokümanlar bundan açıkça bahsetmedi, ancak örnekler User.save () 'nin de bir söz verdiğini gösteriyor. Exec () ve save () dışında modeldeki diğer firavun faresi yöntemleri bir söz veriyor mu, yoksa sadece bu ikisi mi?
thetrystero

Yukarıda belirtildiği gibi, thenbir söz vermek için sorguda da kullanabilirsiniz . Bu çok farklı değil exec. Bunu kullanışlı bulduğum kullanım durumu, gibi bir şey kullanırken Promise.all. execYine de bu tür bağlamlarda işe yarayıp yaramadığından emin değilim .
Anshul Koka

.Exec () ile tam bir örnek ekleyebilir misiniz? @AnshulKoka .exec () 'nin sorguyu otomatik olarak eşzamansız hale getirmesi mi yoksa eşzamansız / await
eklemeli miyim

Sorguyu eşzamansız yapmak zaman uyumsuz / beklemeyi gerektirir, bu nedenle soruyu anladığımdan emin değilim. Tam bir örnek talebiniz için sadece önek örneğimi bekliyor.
Anshul Koka

8

exec()geri arama sağlanmazsa söz verir. Bu nedenle, aşağıdaki model çok kullanışlı ve geneldir - geri aramaları veya vaatleri güzel bir şekilde işleyebilir:

function findAll(query, populate, cb) {

  let q = Response.find(query);

  if (populate && populate.length > 0) {
    q = q.populate(populate);
  }

  // cb is optional, will return promise if cb == null
  return q.lean().exec(cb);

}

Bluebird vaatlerini Mongoose ile kullanmanızı tavsiye ederim, bunu yapmak için bu aramayı kullanın:

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

mavi kuşa neden ihtiyacımız var? exec () olduğunda
Indraraj26
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.