【发布时间】:2020-11-16 16:18:59
【问题描述】:
背景:
客户是具有名称字段的对象。
行是具有以下字段的对象:
-
inLine- 一系列客户 -
currentCustomer- 一位客户 -
processed- 一系列客户
集合 'line' 包含作为 line 对象的文档。
问题:
我正在尝试实现一个可以执行以下操作的程序:
- 将
currentCustomer推送到processed - 将
currentCustomer设置为inLine中的第一个元素 - 弹出
inLine的第一个元素
由于一个字段的新值依赖于另一个字段的先前值,因此原子性在这里很重要。
到目前为止我尝试了什么:
天真的方法
db.collection('line').findOneAndUpdate({
_id: new ObjectId(lineId),
}, {
$set: {
currentCustomer: '$inLine.0',
},
$pop: {
inLine: -1,
},
$push: {
processed: '$currentCustomer',
},
});
但是,currentCustomer 设置为字符串,字面意思是“$inLine.0”,而processed 的字符串字面意思是“$currentCustomer”。
聚合方法
db.collection('line').findOneAndUpdate({
_id: new ObjectId(lineId),
}, [{
$set: {
currentCustomer: '$inLine.0',
},
$pop: {
inLine: -1,
},
$push: {
processed: '$currentCustomer',
},
}]);
但是,我收到以下错误:
MongoError:管道阶段规范对象必须只包含一个字段。
多阶段聚合方法
db.collection('line').findOneAndUpdate({
_id: new ObjectId(lineId),
}, [{
$set: {
currentCustomer: '$inLine.0',
},
}, {
$pop: {
inLine: -1,
},
}, {
$push: {
processed: '$currentCustomer',
},
}]);
但是,$pop 和 $push 是无法识别的管道阶段名称。
我尝试只使用 $set 阶段来制作它,但结果非常丑陋,我仍然无法让它工作。
【问题讨论】:
标签: javascript mongodb mongodb-nodejs-driver