Обновление GraphQL Обновление пользователей Подписчиков с Mongoose / MongodDB - $ set is empty error - PullRequest
0 голосов
/ 01 апреля 2020

У меня настроена эта мутация:

followUser: {
  type: UserType,
  args: {
    _id: { type: GraphQLString },
    firebaseUid: { type: GraphQLString },
    following: { type: new GraphQLList(GraphQLString)},
  },
  resolve(parentValue, { firebaseUid, _id, following}) {
    const update = {
      $set: { "following": [firebaseUid] },
      $push: { "following": { firebaseUid } }
    }
    return UserSchema.findOneAndUpdate(
      { _id }, 
      update, 
      {new: true, upsert: true}
    )
  }
},

Я пытаюсь добавить новых подписчиков в мою коллекцию пользователей graphql. Моя модель пользователя:

const UserSchema = new Schema(
  {
    firebaseUid: String,
    following: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    followers: [{ type: Schema.Types.ObjectId, ref: 'User' }],
  },
  { timestamps: true }
);

module.exports = mongoose.model("User", UserSchema);

Итак, сначала у пользователя нет последователей, поэтому у него еще не будет этого поля. Когда пользователь добавляет кого-то в свой список друзей, это поле появляется в mongodb. Прямо сейчас я получаю эту ошибку:

"message": "'$set' is empty. You must specify a field like so: {$set: {<field>: ...}}",

Я не уверен, правильно ли я делаю $set.

Тип пользователя

const UserType = new GraphQLObjectType({
  name: "User",
  fields: () => ({
    _id: { type: GraphQLString },
    firebaseUid: { type: GraphQLString },
    following: { type: new GraphQLList(GraphQLString) },
    followers: { type: new GraphQLList(GraphQLString) },
    ...
  })
});

edit:

текущий сбор данных mongodb:

_id: ObjectId("5e5c24111c9d4400006d0001")
name: "Mr. Smith"
username: "mrsmith"

после запуска обновления

_id: ObjectId("5e5c24111c9d4400006d0001")
name: "Mr. Smith"
username: "mrsmith"
following: ["fdsaduybfeaf323dfa"] // <-- this gets added

1 Ответ

1 голос
/ 02 апреля 2020

В настоящее время валидатор mongooses отклоняет обновление. Чтобы это исправить, вам нужно следующее:

  1. Вам нужно только $push, поскольку оно автоматически создаст массив, если свойство не существует
  2. Вам следует удалить лишние { } вокруг firebaseUid в $push, потому что в противном случае массив following будет содержать объекты со свойством firebaseUid вместо того, чтобы непосредственно содержать Uid (или будет, если валидатор схемы разрешил это)
  3. Mon go ObjectId s могут быть преобразованы из строк только тогда, когда они имеют шестнадцатеричное 12-байтовое значение, а firebaseUid - нет, поэтому схема должна быть набрана в String вместо ObjectId, так как валидатор отклонит поле для обновления в противном случае.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...