我试图使用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":[{},{}]}
在我看来,问题在于$ projection,但我不知道如何解决这个问题。
编辑:我尝试使用以下代码,使用$ 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);
}
);
});
不幸的是,每个请求都会产生集合中第一个与标准匹配的子文档 - 特别是已更新的子文档。这是一个例子:
说,我在mongo中有以下文档:
{
"_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"。
答案 0 :(得分:2)
问题在于new: true
这是一个有效的例子:
Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, {
'$set': { 'clients.$.contact_status_code': 1 },
},
{
//new: true <-- this was causing the trouble
projection: {
clients: {
'$elemMatch': {contact_status_code: 0}, // 0 because the old record gets matched
},
},
},
(err, campaign) => {
if (err) {
return res.send(err);
}
res.json(campaign);
}
);
我假设,当设置new:true
时,mongo会丢失匹配的上下文。不幸的是,这种方法返回旧记录,但仍然满足了我获取_id的需要。
答案 1 :(得分:0)
在我看来,你获得了广告系列ID,但你也想要客户。$,你试过客户吗。$ ._ id?