更新数组中的单个项目,其中多个条件适用于任何数组项目
Posted
技术标签:
【中文标题】更新数组中的单个项目,其中多个条件适用于任何数组项目【英文标题】:update single item within array where multiple conditions apply to any array item 【发布时间】:2017-09-12 11:49:05 【问题描述】:我有一个基本的猫鼬模型,其属性instruments
表示一个数组。因此它包含多个项目,每个项目具有以下属性:name
、counter
。文档本身有一个自动生成的_id
,类型为ObjectID
。
型号
var ParticipationSchema = new Schema(
instruments: [
name: String,
counter: Number
],
// etc.
,
timestamps: true
);
我现在想准确更改 instruments
数组中的一项,前提是它符合以下要求:
-
文档ID必须等于
58f3c77d789330486ccadf40
应该更改的instruments
-item 的name
必须等于'instrument-1'
instrument
-item 的counter
必须低于3
查询
let someId = '58f3c77d789330486ccadf40';
let instrumentName = 'instrument-1'
let counter = 3;
Participation.update(
$and: [
_id: mongoose.Types.ObjectId(someId) ,
'instruments.name': instrumentName ,
'instruments.counter': $lt: counter
],
$set:
'instruments.$.currentcounter' : counter
,
(err, raw) =>
// ERROR HANDLING
);
假设我在 instruments
-attribute 中有 3 个条目:
"instruments": [
"name": "instrument-1",
"counter": 2
,
"name": "instrument-1",
"counter": 2
,
"name": "instrument-1",
"counter": 2
]
期望的行为:将第一个元素的counter
属性更改为3
,无论如何,运行更新代码1次时,运行多次时不执行任何操作。
实际行为:
它在第一次运行时将第一个元素的counter
属性更改为 3
它在第二次运行时将 2nds 元素的 counter
属性更改为 3
它在第三次运行时将 3rds 元素的 counter
属性更改为 3
【问题讨论】:
【参考方案1】:虽然查询是and
ed,但它们似乎并没有按元素运行。要解决此问题,可以使用$elemMatch
:
Participation.update(
_id: mongoose.Types.ObjectId(someId),
'instruments':
$elemMatch:
'name': instrumentName,
'counter': $lt: counter
,
// etc.
更多信息:
$elemMatch 上的 API 参考
感谢@VEERAM 指出这种行为也记录在mongodb homepage。
【讨论】:
仅供参考。这些查询是隐式的。所以你不需要$and
运营商。您看到的行为记录在这里。docs.mongodb.com/manual/tutorial/query-array-of-documents/…以上是关于更新数组中的单个项目,其中多个条件适用于任何数组项目的主要内容,如果未能解决你的问题,请参考以下文章