MongoDB Stitch SDK возвращает "этап агрегирования" $ lookup "не поддерживается" - PullRequest
1 голос
/ 18 марта 2019

Последняя версия Stitch не поддерживает $ lookup? Я использую mongodb-stitch-server-sdk@4.3.2 и мой сервер работает на версии 4.0.6. У меня есть запрос, подобный следующему:

const {
    Stitch,
    UserPasswordCredential,
    RemoteMongoClient
} = require('mongodb-stitch-server-sdk');

const client = Stitch.initializeDefaultAppClient('<APP ID>');
client.auth.loginWithCredential(new UserPasswordCredential("<username>","<password>")).then(user => {
    client.close();
}).catch(err => {
    console.log(err);
    client.close();
})


mongodb = client.getServiceClient(
  RemoteMongoClient.factory,
  "fleet-home")
testQuery =
  [{
    $match: {
      _id: "c1ba5c3f-263b-5748-9492-e50e0a39cb7a"
    }
  },
  {
    $lookup: {
      from: "aircraft",
      localField: "aircraft_id",
      foreignField: "_id",
      as: "aircraft"
    }
  }]

test = mongodb
.db("FleetDatabase")
.collection("fleet")
.aggregate(testQuery)
.asArray().then((success) => {
  console.log(success)
})

Однако я получаю сообщение об ошибке UnhandledPromiseRejectionWarning: StitchServiceError: aggregation stage "$lookup" is not supported

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Если вы уже используете Stitch, взгляните на Service Webhooks . Webhooks предоставляют HTTP-доступ к функциям Stitch, а функции Stitch поддерживают $lookup.

Webhooks может оказаться проще, чем запросы с SDK, потому что управление конвейерами в JS становится немного запутанным. SDK все еще можно использовать для аутентификации, но данные, к которым можно получить доступ через веб-крючки, могут облегчить жизнь.

MongoDB обещает 10-минутная настройка API . Это заняло у меня немного больше времени, но не намного.

Ваша функция Webhook может выглядеть примерно так:

exports = function() {
  var collection = context.services
    .get("mongodb-atlas")
    .db("FleetDatabase")
    .collection("fleet");
  var doc = collection
    .aggregate([
      {
        $match: {
          _id: "c1ba5c3f-263b-5748-9492-e50e0a39cb7a"
        }
      },
      {
        $lookup: {
          from: "aircraft",
          localField: "aircraft_id",
          foreignField: "_id",
          as: "aircraft"
        }
      }
    ])
    .toArray();

  return doc;
};

После того, как ваш webhook настроен, вам просто нужно позвонить. Если вы используете React, это будет выглядеть так:

  async componentDidMount() {
    const response = await fetch(MY_WEBHOOK);
    const json = await response.json();
    this.setState({ docs: json });
  }
1 голос
/ 27 мая 2019

Вы можете создать функцию Stitch, чтобы сделать это, и вызывать ее прямо из вашего клиента stitch var (который вы назвали client):

См .: https://docs.mongodb.com/stitch/functions/define-a-function/

для создания функции. Если вы выполняете свою функцию как system user, то у вас есть неограниченный доступ к MongoDB CRUD и операциям агрегации:

См .: https://docs.mongodb.com/stitch/authentication/#system-users

Затем для вызова функции:

См .: https://docs.mongodb.com/stitch/functions/call-a-function/

В вашем приложении это будет выглядеть так:

client.callFunction('functionName', args).then(response => {...
...