在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'
条件:(可能是因为
数组中没有直接的对象,但它们在数组中?