MongoError:美元($)前缀字段' $ push' in' $ push'对存储无效

时间:2016-01-14 17:30:00

标签: node.js mongodb mongodb-query

我正在尝试upsert一个Mongo集合的数据集。

  • 目标文件可能存在也可能不存在。
    • 如果它确实存在,它将在嵌入文档中至少有一个项目(拉链),并且应该附加到该文档而不是覆盖它。
    • 如果它不存在,则应将新文档插入集合。

当我运行以下代码时,出现错误:MongoError: The dollar ($) prefixed field '$push' in '$push' is not valid for storage.

我根据文档https://docs.mongodb.org/getting-started/node/update/#update-multiple-documents

将它放在一起

版本: MongoDB(windows)= 3.2.0; mongodb(npm包)= 2.1.4

var query = {
 county: aCountyName, 
 state: aStateName
}    

var params = {
 '$set': {     
  county: 'Boone',
  state: 'MO',
  '$push': {
    zips: {
      '$each': [ '65203' ]
    }
  }
 }
}

(could also be)

var params = {
 '$set': {     
  county: 'Pierce',
  state: 'WA',
  '$push': {
    zips: {
      '$each': [ '98499', '98499' ]
    }
  }
 }
}

db.collection(collectionName).updateMany(query, params, {'upsert': true},
  function(err, results) {
    callback();
  }
);

2 个答案:

答案 0 :(得分:18)

我认为$push$set内无效。而是尝试将其添加为另一个参数,例如:

var params = {
  '$set': {
    county: 'Pierce',
    state: 'WA'
  },
  '$push': {
    zips: {
      '$each': ['98499',
      '98499']
    }
  }
}

答案 1 :(得分:2)

原因是你没有关闭}所以MongoDB认为$push是一个字段的名称,如documentation中提到的那样:

  

字段名称不能包含点(即。)或空字符,并且它们不能以美元符号(即$)开头。

var query = {
 county: aCountyName, 
 state: aStateName
};

var params = {};
params['$set'] = { county: 'Boone', state: 'MO' };
params['$push'] = { zips: { '$each': [ '65203' ] } };

然后:

db.collection(collectionName).updateMany(query, params, {'upsert': true},
  function(err, results) {
    callback();
  }
);