向数组项添加属性会导致“位置运算符未从查询中找到所需的匹配项”

时间:2018-12-14 11:31:36

标签: mongodb

我正在尝试将属性添加到嵌套数组中

var names = [...]; // long list of names, omitted for the sake of brevity

var isNotCriteria = {
    "Persons.Name": {
        $nin: names
    }
}

var isNotUpdateStatement = {
    $set: {
        "Persons.$.IsVerified" : false
    }
}

db["teams"].updateMany(isNotCriteria, isNotUpdateStatement);

teams文档结构的示例:

{
   "_id": "32bace05-2742-4bee-9d56-6e4f168e742b",
   "Name" : "TeamA",
   "Persons" : [{
       "_id" : "5794aa39-8ebf-421d-a28b-ab34d1ccfb2h",
       "Name" : "Person 1"
   }, {
       "_id" : "42602118-cc4a-4121-b869-365d6f73e1d0",
       "Name" : "Person 2"
   }]
}

但是,执行会导致异常:

  

位置运算符未从查询中找到所需的匹配项。   未经扩展的更新:Persons。$。IsVerified

我无法理解失败的原因,因为如果我将条件查询从$nin切换到$in,它将起作用。 如果我使用以下条件运行find,则会看到结果:

db["teams"].find(isNotCriteria);

任何想法我该如何解决?

1 个答案:

答案 0 :(得分:0)

问题实际上是没有teams数组(或数组为空)的Persons个文档。 我将条件查询更改为

var isNotCriteria = {
    $and: [
         {
             "Persons": {
                 $exists: true,
                 $not: {$size : 0} 
             },
             "Persons.Name" : {
                  $nin: names
             }
         }
     ]
 }

现在它可以正常工作了。