Как получить массив внутри узла в mongoDB, используя node.js? - PullRequest
1 голос
/ 09 мая 2020

У меня есть коллекция mongoDB под названием «пользователи». Внутри коллекции «пользователи» несколько пользователей. У каждого пользователя есть массив под названием Cart, и в тележке есть такие предметы:

enter image description here

Теперь я хочу получить все детали «Корзина» ( или объекты) пользователя, указав его идентификатор (_id). Я пробовал таким способом, но возникает исключение

router.get('/getCart', (req, res, next) => {

    console.log(req.body.userId)
    User.findOne({_id: req.body.userId}
    ,(err, userInfo) => {
        userInfo.Cart.find({}, (err, result) => {
            if (err) return next(err);

            let cart = {
                status: 'success',
                code: 200,
                data : result
            };

            res.json(cart);
        })
    })
});

Исключение

TypeError: #<Object> is not a function
    at CoreMongooseArray.find (<anonymous>)
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/src/routes/cart.js:58:23
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/node_modules/mongoose/lib/model.js:4837:16
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/node_modules/mongoose/lib/query.js:4391:12
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/node_modules/mongoose/lib/query.js:2869:28
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on Function instance at:
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/node_modules/mongoose/lib/model.js:4839:13
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/node_modules/mongoose/lib/query.js:4391:12
    at /Users/applefactory/WebstormProjects/OnlineFashionStore/src/UserBackend/node_modules/mongoose/lib/query.js:2869:28
    at processTicksAndRejections (internal/process/task_queues.js:79:11)

Как я могу решить эту проблему? Или есть другой способ добиться этого? Заранее спасибо!

   ------------------------------ UPDATE --------------------------------------

Это моя модель пользователя

const UserSchema = new mongoose.Schema({
    username: {
        type: String,
        validate: {
            validator: username => User.doesNotExist({username}),
            message: "Username already exists"
        }
    },

    email: {
        type: String,
        validate: {
            validator: email => User.doesNotExist({email}),
            message: "Email already exists"
        }
    },

    password: {
        type: String,
        required: true
    },

    Cart : {
        type: Array,
        default: []
    },

    WishList : {
        type : Array,
        default: []
    },
},{timestamps: true});

    UserSchema.pre('save', function () {
        if(this.isModified('password')){
            this.password = hashSync(this.password, 10);
        }
    });

    UserSchema.statics.doesNotExist = async function (field) {
        return await this.where(field).countDocuments() === 0;
    };

    UserSchema.methods.comparePasswords = function (password) {
        return compareSync(password, this.password);
    };

    const User = mongoose.model("User", UserSchema);
    export default User;

1 Ответ

0 голосов
/ 09 мая 2020

Я думаю, вы немного запутались между своей моделью пользователя и моделью корзины, подход будет состоять из использования идентификатора пользователя и запроса модели корзины:

Cart.findOne({ user: user._id })

Если я ошибаюсь, Я настоятельно рекомендую вам использовать ссылки вместо одного документа:

export const cartSchema = new Schema({
  user: {
    type: SchemaTypes.ObjectId,
    ref: 'User'
  }
  // ...
})

Затем вы можете использовать populate:

Cart.findOne({ user: user._id }).populate('user').execPopulate()

В действительности, при сохранении ваш объект будет больше похож на :

{
  _id: '123218932183',
  cart: ['1', '2', '3'],
  wishList: ['1', '2', '3'],
  username: '...',
  // ....
}

Разумеется, замена целочисленных идентификаторов на ObjectIds.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...