链接mongoose查询的最佳方式

时间:2016-07-18 14:48:40

标签: node.js mongodb express mongoose

我是使用node和mongoose的新手开发人员,并想知道用mongoose链接查询的最佳方法是什么。我在下面做,它不起作用。

User.findByIdAndUpdate(req.params._id, user, { upsert: true })
.exec((err, updatedUser) => {
  if (addedCollections) {
    return User.findByIdAndUpdate(req.params._id, { $push: { _collections: { $each: addedCollections } } }, { upsert: true }).exec();
  }
  return new Query;
})
.exec(() => {
  return User.findById(req.params._id).populate('_collections');
})
.exec((err, user) => {
  res.json({ user });
})

如何链接多个查询?

2 个答案:

答案 0 :(得分:9)

您可以使用承诺链,它看起来非常类似于您尝试做的事情:

User.findByIdAndUpdate(req.params._id, user, { upsert: true })
    .then(updatedUser => {
      if (addedCollections) {
        return User.findByIdAndUpdate(req.params._id, { $push: { _collections: { $each: addedCollections } } }, { upsert: true });
      }
    })
    .then(() => {
      return User.findById(req.params._id).populate('_collections');
    })
    .then(user => {
      res.json({ user });
    })
    .catch(err => {
      res.status(500).json({ error : err });
    });

答案 1 :(得分:1)

您可以使用Rx和mongoose-observables。使用Rx,.flatMap()等同于.then()。

var Rx = require('rx');
var observables = require('mongoose-observables');

/* get public header data, list of collections and projects */

router.get("/header", function(req, res) {
  let articleTitle = observables.finder.find(Articles, '{}', ['title'], null);
  let collectionTitle = observables.finder.find(Collections, '{}', ['title'], null);

  Rx.Observable.forkJoin([articleTitle, collectionTitle])
    .subscribe(
      (docs) => res.json(docs),
      (err) => console.error(err)
    );
});

https://www.npmjs.com/package/mongoose-observables

的更多示例