【发布时间】:2019-12-28 17:34:03
【问题描述】:
考虑架构:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const EightWeekGamePlanSchema = new Schema({
Week: {
type: Number,
required: true
},
LeadId: {
type: String,
required: true
},
PackageId: {
type: String,
required: true
},
BusinessName: {
type: String,
required: true
},
PhoneNumberMasque: {
type: String,
required: true
},
City: {
type: String,
required: true
},
Rooms: {
type: Number,
required: true
},
LeadStartDate: {
type: Date
},
LeadEndDate: {
type: Date
},
TargetedToBeClaimedByClientType: {
type: Number,
required: true
},
TotalClaimsLeftToBeClaimedByClientType: {
// incresed by 1 every time it's claimed
type: Number,
required: true
},
TotalClaimsToBeClaimedByClientType: {
// Stays fixed
type: Number,
required: true
},
Status: {
type: Number,
required: true
},
InsertDate: {
type: Date,
default: Date.now
}
});
module.exports = EightWeekGamePlan = mongoose.model(
"eightweekgameplan",
EightWeekGamePlanSchema
);
我正在尝试编写一个非常复杂的查询:如果它们的 LeadID 出现在给定数组 winnerLeads 中并且它们的 TargetedToBeClaimedByClientType 属性等于给定的 groupTarget :
router.post("/add-claims-to-group", auth, async (req, res) => {
const { howManyClaims, groupTarget, winnerLeads, week } = req.body;
EightWeekGamePlan.updateMany(
{
LeadId: {
$in: winnerLeads
},
TargetedToBeClaimedByClientType: groupTarget
},
{ $inc: { TotalClaimsToBeClaimedByClientType: howManyClaims } },
{ multi: true },
(err, writeResult) => {
if (err) {
console.log(err);
} else {
console.log(writeResult);
}
}
);
}
否则,请执行某种Create:获取属于LeadID 的现有EightWeekGamePlan 文档之一,复制它并将其TotalClaimsToBeClaimedByClientType 属性设置为howManyClaims。
是否可以在一个查询中结合更新和创建操作?
【问题讨论】:
-
@srinivasy:感谢您的帮助,部分工作,如果插入代码插入一个只有 4 个属性的新文档
(LeadId , TargetedToBeClaimedByClientType, Week , _id),但我要插入所有属性,而不仅仅是 4 个。是否可以在插入文档时告诉 Mongo 运行一个函数,然后在该函数中处理文档的创建? -
它只会插入你在过滤器或更新对象中传递的字段,所以它不能插入所有字段或未传递的字段,所以你的意思是如果你插入默认值不通过一个领域?尝试检查“{setOnInsert : }”,但即使在那里你也需要传递字段
-
@srinivasy:你的回答很好,所以我接受它。我会尽力管理
标签: javascript node.js mongodb mongoose