JavaScript — Mongodb $ и оператор не работает должным образом

Mongodb $ и оператор не работает должным образом

Вы запрашиваете документы встроенного массива, простой $ и запрос здесь не помогут, как вы его используете.

По сути, мы хотим сопоставить несколько полей из одного встроенного документа в массиве.

Итак, давайте рассмотрим этот пример:

Для простоты я добавил несколько полей из моего понимания, и, учитывая, что вы столкнулись с проблемой с $ и запросом, я буду, и, соответственно, предполагая, что запрос покоя не меняется и работает.

 db.followers.find().pretty() { "_id" : ObjectId("5d984403d933b7b079038ca9"), "userId" : "1", "followers" : [ { "fId" : "4", "following" : true }, { "fId" : "2", "following" : true }, { "fId" : "3", "following" : false } ] } { "_id" : ObjectId("5d984422d933b7b079038caa"), "userId" : "2", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "3", "following" : false }, { "fId" : "4", "following" : false } ] } { "_id" : ObjectId("5d984432d933b7b079038cab"), "userId" : "3", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "2", "following" : true }, { "fId" : "4", "following" : true } ] } { "_id" : ObjectId("5d984446d933b7b079038cac"), "userId" : "4", "followers" : [ { "fId" : "1", "following" : false }, { "fId" : "2", "following" : true }, { "fId" : "3", "following" : true } ] } 

ANS 1:

 db.followers.find({followers:{ "fId": "1", "following": true }}).pretty() { "_id" : ObjectId("5d984422d933b7b079038caa"), "userId" : "2", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "3", "following" : false }, { "fId" : "4", "following" : false } ] } { "_id" : ObjectId("5d984432d933b7b079038cab"), "userId" : "3", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "2", "following" : true }, { "fId" : "4", "following" : true } ] } 

Обратите внимание, как массив followers используется в запросе. ссылка введите описание ссылки здесь

В вашем случае мы можем изменить ваш запрос следующим образом:

  { $and: [ // by default it's $and only, you don't have to mention explicitly { $and: [ // you can even remove this $and "following": { "userId": mongoose.Types.ObjectId(targetId), "following": true } ] }, { $or: [{ firstName: firstNameRegex }, { lastName: lastNameRegex }] }, { blockedUsers: { $nin: mongoose.Types.ObjectId(req.userId) } } ] } 

ANS 2:

Вы можете использовать $ elemMatch

$ elemMatch используется для запроса нескольких полей из одного документа в массиве.

 db.followers.find({followers: {$elemMatch: { "fId": "1", "following": true }}}).pretty() { "_id" : ObjectId("5d984422d933b7b079038caa"), "userId" : "2", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "3", "following" : false }, { "fId" : "4", "following" : false } ] } { "_id" : ObjectId("5d984432d933b7b079038cab"), "userId" : "3", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "2", "following" : true }, { "fId" : "4", "following" : true } ] } 

Запрос для вас будет:

 { $and: [ { "following": {$elemMatch: { "userId": mongoose.Types.ObjectId(targetId), "following": true } } }, { $or: [{ firstName: firstNameRegex }, { lastName: lastNameRegex }] }, { blockedUsers: { $nin: mongoose.Types.ObjectId(req.userId) } } ] } 

НО ЭТО БУДЕТ НЕПРАВИЛЬНО (см. Запрос ниже):

 db.followers.find({"followers.fId": "1", "followers.following": true }).pretty() { "_id" : ObjectId("5d984422d933b7b079038caa"), "userId" : "2", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "3", "following" : false }, { "fId" : "4", "following" : false } ] } { "_id" : ObjectId("5d984432d933b7b079038cab"), "userId" : "3", "followers" : [ { "fId" : "1", "following" : true }, { "fId" : "2", "following" : true }, { "fId" : "4", "following" : true } ] } { "_id" : ObjectId("5d984446d933b7b079038cac"), "userId" : "4", "followers" : [ { "fId" : "1", "following" : false }, { "fId" : "2", "following" : true }, { "fId" : "3", "following" : true } ] } 

Запись

Чтобы увидеть только документы матчей, вы можете использовать

 db.followers.find({followers: {$elemMatch: { "fId": "1", "following": true }}},{"followers.$": 1}).pretty() db.followers.find({followers: {$elemMatch: { "fId": "1", "following": true }}},{"followers.$": 1}).pretty() 
Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector