在MongoDB中$unwind之后,$匹配并更新对象中的某个键
我有如下文件:在MongoDB中$unwind之后,$匹配并更新对象中的某个键,mongodb,mongodb-query,Mongodb,Mongodb Query,我有如下文件: { "_id" : ObjectId("5dc027d38da295b969eca67c"), "emp_no" : 10031, "salaries" : [ { "salary" : 40000, "from_date" : "1991-09-01", "to_date" : "1992-08-31" }, {
{
"_id" : ObjectId("5dc027d38da295b969eca67c"),
"emp_no" : 10031,
"salaries" : [
{
"salary" : 40000,
"from_date" : "1991-09-01",
"to_date" : "1992-08-31"
},
{
"salary" : 40859,
"from_date" : "1992-08-31",
"to_date" : "1993-08-31"
},
{
"salary" : 41881,
"from_date" : "1993-08-31",
"to_date" : "1994-08-31"
}
]
}
作为一个目标,我需要为每个对象增加salary
,每个对象的from_date
关键字范围为1985-01-01-1985-12-31到目前为止,我提出了以下问题:
db.emp_salaries.aggregate( [
{ $unwind: "$salaries" },
{ $match: {
"salaries.from_date": {$gte: "1985-01-01"},
"salaries.from_date": {$lte: "1985-12-13"},
} }
] )
但是我不能以这种方式设置from\u date
键。我不知道怎么做。这个$match
似乎被完全忽略了。我听说有一个操作员可以自动瞄准这样一个键,而不管它从对象开始的位置如何,但却找不到它。如何定位此键并对
薪资执行更新?尝试对日期字段使用ISODate而不是常规字符串。
它可能会根据字符串值进行比较,而不是按日期进行比较,这可以使用shell命令来完成
db.emp_salaries.updateMany({
'salaries.from_date': {
$gte: '1985-01-01',
$lte: '1985-12-13'
}
},
{
$inc: {'salaries.$.salary': 1000}
})
过滤的位置运算符$[]
标识与更新操作的阵列过滤器
条件匹配的阵列元素。以下查询将使用匹配条件更新数组中的子文档字段
db.arr_upd.updateMany(
{ },
{ $inc: { "salaries.$[elem].salary" : 1000 } },
{ arrayFilters: [ { $and: [ { "elem.from_date": { $gte: "1991-09-01" } }, { "elem.from_date": { $lte: "1992-08-31" } } ] } ] }
)
这将分别将前两个元素的salary
值更新为41000
和41859
(如问题帖中所示的示例文档)。谢谢,这是有效的:)请您简单解释一下ArrayFilter是如何工作的?我退房了,但我还是不明白这里是怎么回事。此外,这个过滤器位置运算符的工作方式类似于某种“指针”,您可以使用它来引用数组元素,对吗?请参阅文档中的这些内容。数组中的每个元素都使用arrayFIelds中的条件进行检查,并在匹配发生时更新(更新中的字段和值)。这是一种奇怪的语法;通过一些练习可以理解。还可以看到:。再次非常感谢!我无法通过“工资”。从\u date'
条件:(可能是因为数组中没有直接的对象,但它们在数组中?