Обновление массива монго завершается неудачно при выполнении через AWS lambda - PullRequest
0 голосов
/ 08 ноября 2018

У меня следующий запрос:

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

Версия моего сервера Mongo - 3.6.6. Я пробовал это с помощью оболочки, и она работает.

Однако, когда я пытаюсь выполнить тот же запрос, используя функцию Lambda с использованием Node.js в AWS, я получаю следующую ошибку:

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 голосов
/ 09 ноября 2018

Хорошо, это была довольно глупая ошибка. Обновление элементов массива несовместимо с загруженной мною версией node_module mongo (это была версия 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'} ] } )

И это сработало.

0 голосов
/ 08 ноября 2018

Вы можете попытаться удалить DBNAME из MONGO_URL и указать базу данных после того, как будет установлено соединение с сервером.

Согласно документации база данных, указанная в строке подключения для mongo, - это база данных, которая будет использоваться для поиска и аутентификации пользователя, пытающегося получить доступ к серверу, по умолчанию это admin * 1008. *

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'} ] })
}

Это также похоже на то, как они это делают в официальной документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...