Sails.js和本机mongodb查询

Sails.js和本机mongodb查询,sails.js,sails-mongo,Sails.js,Sails Mongo,我尝试在SailsJS(v0.10)中执行以下操作: 因此,本质上我所做的是将文档从“开发”集合复制到“已发布”集合中,并保留“\u id”。具有相同的“\u id”非常重要,因为它允许更简单的未来操作,我可以将“开发”文档和“发布”文档视为一个文档(因此,“删除”调用只需要向其传递一个“\u id”值) 无论我做什么,我似乎都无法让它发挥作用。我曾尝试使用“native()”和“require('mongodb').ObjectID”,但“published”集合中的“\u id”总是重新生成

我尝试在SailsJS(v0.10)中执行以下操作:

因此,本质上我所做的是将文档从“开发”集合复制到“已发布”集合中,并保留“\u id”。具有相同的“\u id”非常重要,因为它允许更简单的未来操作,我可以将“开发”文档和“发布”文档视为一个文档(因此,“删除”调用只需要向其传递一个“\u id”值)

无论我做什么,我似乎都无法让它发挥作用。我曾尝试使用“native()”和“require('mongodb').ObjectID”,但“published”集合中的“\u id”总是重新生成的-因此,如果我多次运行查询,则“published”集合中的文档会有多个副本。每个都具有不同的“\u id”和不同的“版本”值。这不是很有帮助。为了以防万一,我甚至在我的“已发布”模型中将“autoPK”设置为false

最后,我在文档中添加了一个值--“developmentId”-以存储原始的“development.\u id”,并将其用作目前的解决方法:

db.development.find({
  _id: ObjectId(idToUseInBothCollections),
  subscriberId: subscriber
}).forEach(function(doc) {
  doc.status = 'published';
  db.development.update({
    _id: ObjectId(idToUseInBothCollections),
    subscriberId: subscriber
  }, {
    $inc: {
      version: 1
    }
  });
  db.published.update({
    developmentId: idToUseInBothCollections,
    subscriberId: subscriber
  }, doc, {
    upsert: true
  });
})
这是我现在在控制器中拼凑的实际代码:

var ObjectId = require('mongodb').ObjectID;
var toPublish = req.body.toPublish;
var subscriber = req.user.subscriber;

Development.findOne({
  id: ObjectId(toPublish),
  subscriberId: subscriber
}).exec(function(err, found) {
  if (err) {
    return res.json({
      msg: 'Failed.'
    });
  }
  found.status = 'published';
  publish(found);
});

var publish = function(found) {
  Development.native(function(err, development) {
    development.update({
      _id: ObjectId(toPublish),
      subscriberId: subscriber
    }, {
      $inc: {
        version: 1
      }
    }, function(err, updated) {
      if (err) {
        return res.json({
          msg: 'Failed.'
        });
      } else {
        //success
      }
    });
  });
  Published.native(function(err, published) {
    published.update({
      developmentId: toPublish,
      subscriberId: subscriber
    }, found, {
      upsert: true
    }, function(err, updatedpublished) {
      if (err) {
        return res.json({
          msg: 'Failed.'
        });
      } else {
        return res.json({
           msg: 'Success'
        });
      }
    });
  });
};

是的,它是有效的,但我真的不明白为什么有必要这样做。我想知道,有没有一种方法可以在SailsJS中以不太混乱的方式执行我的首选查询?

您解决了这个问题吗?恐怕没有。虽然我最终还是使用了“async.瀑布”使事情更易于管理。除此之外,我还在使用额外的“developmentId”字段。
var ObjectId = require('mongodb').ObjectID;
var toPublish = req.body.toPublish;
var subscriber = req.user.subscriber;

Development.findOne({
  id: ObjectId(toPublish),
  subscriberId: subscriber
}).exec(function(err, found) {
  if (err) {
    return res.json({
      msg: 'Failed.'
    });
  }
  found.status = 'published';
  publish(found);
});

var publish = function(found) {
  Development.native(function(err, development) {
    development.update({
      _id: ObjectId(toPublish),
      subscriberId: subscriber
    }, {
      $inc: {
        version: 1
      }
    }, function(err, updated) {
      if (err) {
        return res.json({
          msg: 'Failed.'
        });
      } else {
        //success
      }
    });
  });
  Published.native(function(err, published) {
    published.update({
      developmentId: toPublish,
      subscriberId: subscriber
    }, found, {
      upsert: true
    }, function(err, updatedpublished) {
      if (err) {
        return res.json({
          msg: 'Failed.'
        });
      } else {
        return res.json({
           msg: 'Success'
        });
      }
    });
  });
};