在AWS Lambda上执行mongo数组更新失败

时间:2018-11-08 19:50:35

标签: mongodb aws-lambda

我有以下查询:

db.COLLECTIONNAME.update({ groupId:11 },{ $set: { "users.$[elem1].preferred_username": 'cmaronchick2'} },{ arrayFilters: [ {"elem1.username":'cmaronchick'} ] })

我的Mongo服务器版本为3.6.6。我已经尝试过使用shell了,并且可以使用。

但是,当我在AWS上使用Node.js使用Lambda函数尝试相同的查询时,出现以下错误:

No array filter found for identifier \'elem1\'

我该如何解决?

这是连接代码:

var mongo = require("mongodb").MongoClient,
assert = require("assert");

const MONGO_URL = 'mongodb://USERNAME:PASSWORD@MONGODBURL:PORT/DBNAME';

// console.log('Loading function');

exports.handler = (event, context) => {
console.log('Received event:', JSON.stringify(event, null, 2));

mongo.connect(MONGO_URL, function (err, db) {
    db.COLLECTIONNAME.update({ groupId:11 },{ $set: { "users.$[elem1].preferred_username": 'cmaronchick2'} },{ arrayFilters: [ {"elem1.username":'cmaronchick'} ] })
}

2 个答案:

答案 0 :(得分:1)

完成与服务器的连接后,您可以尝试从DBNAME中删除MONGO_URL并指定数据库。

对于documentation,在mongo的连接字符串中指定的数据库是将用于查找和验证尝试访问服务器的用户的数据库,默认值为admin

const MONGO_DB = DBNAME
const MONGO_URL = 'mongodb://USERNAME:PASSWORD@MONGODBURL:PORT';

mongo.connect(MONGO_URL, function (err, client) {
    let db = client.db(MONGO_DB) // <- Specifying the database
    db.COLLECTIONNAME.update({ groupId:11 },{ $set: { "users.$[elem1].preferred_username": 'cmaronchick2'} },{ arrayFilters: [ {"elem1.username":'cmaronchick'} ] })
}

这与他们在official documentation

中的操作方式类似

答案 1 :(得分:0)

好的,这是一个非常愚蠢的错误。更新数组元素与我上载的mongo的node_module版本不兼容(它是2.1.X版,而3.1中引入了数组过滤器)。

我分别将mongodb和mongodb-core版本分别更新为3.1.9和3.1.8(使用npm update mongodb mongodb-core),并按如下方式更新了我的代码:

const myDB = db.db('DBNAME');
const profileCollection = myDB.collection('profile');
const groupsCollection = myDB.collection('groups');

groupsCollection.updateOne({ groupId:11 },
    { $set: { "users.$[elem1].preferred_username": 'cmaronchick1'} },
    { arrayFilters: [ {"elem1.username":'cmaronchick'} ] } )

那行得通。