私は SailsJS (v0.10) で次のことをしようとしています:
var idToUseInBothCollections = req.body.docId;
var subscriber = req.user.subscriber;
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({
_id: ObjectId(idToUseInBothCollections),
subscriberId: subscriber
}, doc, {
upsert: true
});
})
つまり、本質的に私がやっていることは、ドキュメントを「開発」コレクションから「公開」コレクションにコピーし、「_id」を保持することです。同じ「_id」を持つことは、「開発」ドキュメントと「公開」ドキュメントを 1 つとして扱うことができる、より単純な将来のアクションを可能にするため重要です (したがって、「削除」呼び出しには 1 つの「_id」値のみが必要です)それに渡されます)。
何をしても、これを機能させることができないようです。「native()」と「require('mongodb').ObjectID」を使用してみましたが、「発行済み」コレクションの「_id」は常に再生成されるため、ドキュメントの複数のコピーがクエリを数回実行すると、「公開された」コレクションになります。それぞれに異なる「_id」と異なる「バージョン」値があります。これはあまり役に立ちません。念のため、「公開済み」モデルで「autoPK」を false に設定しました。
ドキュメントに値「developmentId」を追加して、元の「development._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 で最初に選択したクエリをよりすっきりした方法で実行する方法はありますか?