【问题标题】:Mongoose: Property 'pull' does not exist on type 'Address[]'Mongoose:“地址 []”类型上不存在属性“拉”
【发布时间】:2020-12-12 03:42:20
【问题描述】:

我在使用 Mongoose 5.10.0 时遇到问题

考虑以下类

帐号:

export class Account {
    _id: string;
    email: string;
    password: string;
    phone: string;
    address?: Address[] = [];
}

地址:

export class Address {
    _id: string;
    streetName: string;
    zipCode: string;
    city: string;
    default: boolean | undefined;
}

以及适当的数据库模型

帐号:

import mongoose, { Schema, Document } from "mongoose";
import { Account } from "../classes/account.class";
import { addressSchema } from "./address.model";

export const accountSchema = new Schema({
    _id: Schema.Types.ObjectId,
    email: String,
    phone: String,
    password: String,
    address: [addressSchema],
);

export type AccountModel = Document & Account;
export const Accounts = mongoose.model<AccountModel>("Account", accountSchema);

地址:

import mongoose, { Schema, Document } from "mongoose";
import { Address } from "../classes/address.class";

export const addressSchema: Schema = new Schema({
    _id: Schema.Types.ObjectId,
    streetName: String,
    zipCode: String,
    city: String,
    default: Boolean,
});

export type AddressModel = Document & Address;
export const Addresses = mongoose.model<AddressModel>("Address", addressSchema);

现在,当我从数据库中获取一个帐户并尝试对结果的地址执行拉取操作时,根本找不到 pull() - 方法,我得到 Property 'pull' does not exist on type 'Address[]'.

架构的定义方式是否存在根本性错误?我哪里错了?

【问题讨论】:

  • Account[] 是一个数组。数组没有pull 方法。
  • 因为在你的语句前面有一个 await 我猜你想在数据库端运行 pull 并且你正在寻找这样的东西:stackoverflow.com/questions/56664906/…
  • @mickl 感谢您将我推向正确的方向,从而解决了问题。愿意把它作为答案吗?

标签: node.js typescript mongoose mongoose-schema


【解决方案1】:

在您的代码中,您期望 MongoDB 的 pull 运算符是 JavaScript 方法。您有两种方法可以实现您想要做的事情:

您可以使用.findOne() 检索文档,使用JS 代码修改数组(例如slice),然后运行.save() 以将这些更改与您的数据库同步。

但是,如果您只想提取地址,那么您可以直接在数据库上运行更新操作:

await Accounts.update({_id: idToFind}, {"$pull": { "address": { _id: addressId } } })

使用第二种方法时,您最终将只有一个数据库调用

【讨论】:

    【解决方案2】:
    import { Types } from "mongoose";
    import { AddressModel } from './Address';
    
    const account = await Accounts.findOne({_id: idToFind});
    const accountAddressArray = account.address as Types.DocumentArray<AddressModel>
    accountAddress.pull(...)
    

    【讨论】:

    • 这里的目标是什么?请提供一些描述您的代码的文本,仅放置没有介绍或 cmets 的代码块通常没有帮助。
    • @TadhgMcDonald-Jensen,目标(突然)是解决作者的问题
    猜你喜欢
    • 2019-11-05
    • 2017-07-15
    • 2017-01-11
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多