Запросить поля в 3 разных вложенных массивах в одном документе в Mongoose?

Ниже моя схема дизайна

const Schema1 = mongoose.Schema({
      _id: false,
      id: { type: mongoose.Schema.Types.ObjectId,
        ref: 'UserinfoSchema' 
      },
      name: { type: String , default: null },
      from: { type: Date, default: Date.now }
})

const ProfileSchema = mongoose.Schema({
  profilename:{
    type: String,
    required: true
  },
  list:{
    acceptedList:[ Schema1 ],
    requestedList:[ Schema1 ],
    pendingList:[ Schema1 ]
  }
})

Я хочу построить запрос, который запрашивает во всех вложенных массивах (то есть, acceptList, requiredList, pendingList) и выяснить, присутствует ли идентификатор или нет, и обновить запрашиваемый список, если идентификатор не присутствует ни в одном из списка.

Любая техника полезна. Производительность - это главное.

2 ответа

Решение

Вы можете использовать $or Оператор для этого:

db.Collection.update({
    $or: {
        "list.acceptedList": {$nin: [your_id]},
        "list.requestedList": {$nin: [your_id]},
        "list.pendingList": {$nin: [your_id]}
    }
}, {
    $addToSet: {
        "list.requestedList": your_id
    }   
});

$nin Оператор с [your_id] проверяет, не находится ли ваш идентификатор в 3 массивах, вы должны использовать [], потому что он допускает только массивы.

Итак, в вашем JavaScript-коде, когда пользователь принимает запрос, вы можете использовать этот запрос (вы должны получить данные, которые вы хотите вставить в acceptList ранее):

db.Collection.update({
    _id: collection_id,
    "list.requestedList": request_id
}, {
    $pull: {
        "list.requestedList": your_id // I re use what i give to you
    },
    $addToSet: {
        "list.acceptedList": your_id // or what you want
    }
})
Другие вопросы по тегам