Как перебрать массив объектов поддокумента mongoose - PullRequest
0 голосов
/ 02 мая 2019

Попытка реализовать условный оператор, опирающийся на массив объектов поддокументов, поэтому мне нужно выполнить итерацию по коллекции пользователей в базе данных и проверить внутри каждого массива объектов поддокумента пользователя с findIndex, как для javascript

Коллекция пользователей

const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true,
    lowercase: true
  }
  friends: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    }
  ],
  family: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    }
  ],
  acquaintances: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    }
  ],
  following: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    }
  ],
  pendingFriendConfirmationData:[
    {
      storedUserId : {type: String},
      choosenCategories: [{label: {type: String}, value: {type: String}}]
    }
  ]
});

const Users = mongoose.model("Users", userSchema);
module.exports = Users;

теперь я могу получить доступ к коллекции Users с помощью

db.Users.find()

моего примера результата для

let filter = {"_id": userId}
let projection = {username: 1, friends: 1, family: 1, acquaintances: 1, following: 1, pendingFriendConfirmationData: 1}

db.Users.findOne(filter, projection, (err, user)=>{
      console.log(user)
    })

{
   friends: [],
   family: [],
   acquaintances: [],
   following: [],
   _id: 5ca1a43ac5298f8139b1528c,
   username: 'ahmedyounes',
   pendingFriendConfirmationData: [
     {
       choosenCategories: [Array],
       _id: 5ccb0fcf81a7944faf819883,
       storedUserId: '5cc95d674384e302c9b446e8'
     }
   ]
 }

с акцентом на pendingFriendConfirmationData на следующем скриншоте из MongoDB Compass

enter image description here

Я хочу повторить, как это

let filter = {"_id": userId}
let projection = {username: 1, friends: 1, family: 1, acquaintances: 1, following: 1, pendingFriendConfirmationData: 1}

db.Users.findOne(filter, projection, (err, user)=>{
      let data = user.pendingFriendConfirmationData
      for(let i in data){
       if(data[i].choosenCategories.findIndex(v => v.label === "friend") !== -1){
        console.log("he is a friend")
      }
      }
    })

Как перебирать pendingFriendConfirmationData и choosenCategories, как указано выше

на данный момент, если я console.log (данные) следующим образом

db.Users.findOne(filter, projection, (err, user)=>{
      let data = user.pendingFriendConfirmationData
      console.log(data)
    })

я получаю

enter image description here

1 Ответ

0 голосов
/ 03 мая 2019

Я понял это Более быстрые запросы мангуста с постным

Опция Lean сообщает Mongoose, что нужно пропустить увлажнение документов с результатами. Это делает запросы быстрее и требует меньше памяти, но в результате документы представляют собой простые объекты JavaScript (POJO), а не документы Mongoose. В этом уроке вы узнаете больше о компромиссах использования lean ().

В моем предыдущем примере решением было бы добавить {lean: true}

db.Users.findOne(filter, projection, {lean: true}, (err, user)=>{
      let data = user.pendingFriendConfirmationData
      console.log(data)
    })

также здесь

db.Users.findOne(filter, projection, {lean: true}, (err, user)=>{
      let data = user.pendingFriendConfirmationData
      for(let i in data){
       if(data[i].choosenCategories.findIndex(v => v.value === "friends") !== -1){
        console.log("he is a friend")
      }
      }
    })

// he is a friend

Заключение

для итерации по глубоко вложенному массиву вложенных документов, в котором вы должны убедиться что вы работаете с простыми объектами JavaScript (POJO), используя lean ()

db.Users.find().lean()
...