Запросить поля в 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
}
})