我試圖用express和mongoose構建一個簡單的任務隊列。這個想法是獲得一個客戶端,並返回活動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:
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」 - 這次它按預期運行。但是當我第二次運行相同的查詢時,我獲得了完全相同的對象,但我期望得到一個ID爲「591493d95d48e2738b0d4318」的ID。
[如何獲取嵌入數組中更新後的新值?](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