私はエクスプレスとモンゴーズで簡単なタスクキューを構築しようとしています。アイデアは、単一のクライアントを取得し、キャンペーンIDとクライアントID(キャンペーンのサブ文書です)を返します。たびに誰かがクライアントを取得し、そのステータスコードは1に設定されて、私は次のクエリを作ってみた:
router.post('/lease', (err, res) => {
Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, {
'$set': { 'clients.$.contact_status_code': 1 },
},
{
new: true,
projection: {
'clients.$': true,
},
},
(err, campaign) => {
if (err) {
return res.send(err);
}
res.json(campaign);
}
);
});
しかし、私はこのエンドポイントに接続した後に取得していますすべてがこれです:
{"_id":"591483241a84946a79626aef","clients":[{},{}]}
問題は$投影ですが、これを修正する方法はわかりません。
編集:私は$ elemMatchを利用し、次のコードを使用してみました: - ない更新された具体的には、1つの
router.post('/lease', (err, res) => {
Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, {
'$set': { 'clients.$.contact_status_code': 1 },
},
{
new: true,
projection: {
clients: {
'$elemMatch': {contact_status_code: 1},
}
},
},
(err, campaign) => {
if (err) {
return res.send(err);
}
res.json(campaign);
}
);
});
残念ながら、それぞれの要求が基準に適合し、コレクション内の最初のサブドキュメントを、生み出します。次に例を示します。
言って、私はモンゴで、次の書類を持っている:
{
"_id" : ObjectId("591493d95d48e2738b0d4317"),
"name" : "asd",
"template" : "{{displayname}}",
"isEnabled" : true,
"clients" : [
{
"displayname" : "test",
"_id" : ObjectId("591493d95d48e2738b0d4319"),
"contact_status_code" : 0
},
{
"displayname" : "client",
"_id" : ObjectId("591493d95d48e2738b0d4318"),
"contact_status_code" : 0
}
],
"__v" : 0
}
私が最初にクエリを実行し、次の結果を得る:
{"_id":"591493d95d48e2738b0d4317","clients":[{"displayname":"test","_id":"591493d95d48e2738b0d4319","contact_status_code":1}]}
を
クライアントID「591493d95d48e2738b0d4319」を通知します - 今回は、期待どおりに実行されます。しかし、同じクエリを2回目に実行すると、同じオブジェクトが得られますが、idが "591493d95d48e2738b0d4318"のものが得られます。
埋め込み型アレイでの更新後に新しい値を取り戻すにはどうすればいいですか?](http://stackoverflow.com/questions/35946989/how-to-get-back-the-new-value-更新後の組み込み配列) – Veeram
@Veeram答えは、$ elemMatchを使用して_idでクエリすることを示しています。残念ながら、私は_idをあらかじめ知りません:\ – foverzar
それはその投稿の答えです。 elemmatchの独自の基準を使用するように更新することができます。 'のようなもの{:{ "クライアント": "投影"{ "$ elemMatch":{ "contact_status_code":1} } } }' – Veeram