【问题标题】:How to use $pull with TypeORM to delete an object insude array using Mngodb?如何使用 $pull 和 TypeORM 使用 Mongodb 删除数组内的对象?
【发布时间】:2019-10-14 10:55:38
【问题描述】:

我在 mongodb 中有一个带有架构的集合:

{ 
"_id" : "",
 "vins" : [ { "field" : "" } ], 
"xyz" : "", 
"password" : "", 
"username" : ""
 }

我想删除“vins”数组中匹配特定条件的对象。通常,使用“$pull”操作符可以很容易地做到这一点。但我找不到任何关于如何使用 TypeORM 的信息。
(值得一提的是,我几乎没有使用 typeorm 的经验,而是在我的整个职业生涯中都使用过 mongoose)。

当我尝试时

this.repo.update({ "xyz" : <value>} ,{ $pull : { "fields" : { "field": <value> } } })

我收到一个错误

类型参数 '{ $pull: { "vins": { "vin": any; }; }; }' 不可分配给“DeepPartial”类型的参数。对象字面量只能指定已知属性,而 '$pull' 不存在于 'DeepPartial' 类型中

【问题讨论】:

  • FindOneAndUpdate 看起来很简单,与猫鼬或本机驱动程序没有太大区别。你试过了吗?
  • 当我尝试这个查询this.repo.update({ "xyz" : &lt;value&gt;} ,{ $pull : { "fields" : { "field": &lt;value&gt; } } }) 时,打字稿编译器给出了这个错误Argument of type '{ $pull: { "vins": { "vin": any; }; }; }' is not assignable to parameter of type 'DeepPartial&lt;User&gt;'. Object literal may only specify known properties, and '$pull' does not exist in type 'DeepPartial&lt;User&gt;'

标签: node.js mongodb typescript typeorm


【解决方案1】:

我终于设法让它工作了:

let mongoRepository = getMongoRepository(Repo);  
let result =  await  mongoUserRepository.findOneAndUpdate({ "field1" : value} , {  $pull: {"fields" :{"field":  value}  }} );

看来我正在寻找的方法在 mongoRepository 中可用,但在 typeorm “Repository”中不可用。

【讨论】:

    【解决方案2】:

    看起来MongoRepositoryupdateOneupdateMany 方法允许这样做。例如,我可以使用updateOne 进行编译和运行测试。

    https://github.com/typeorm/typeorm/blob/2bb0e398f922561f1cbb8ebbb19d20aa093e8bc2/src/repository/MongoRepository.ts#L356

    示例用法:

      const user = new User();
      user.firstName = "Timber";
      user.lastName = "Saw";
      user.flags = ["typescript", "nodejs"];
    
      const repo = getMongoRepository(User);
      await repo.save(user);
      console.log("Saved");
    
      await repo.updateOne({ _id: user.id }, { $pull: { flags: { $in: ["typescript"] } } });
      console.log("Updated!");
    

    【讨论】:

    • updateOne 方法给我错误Property 'updateOne' does not exist on type 'UserRepository'
    • @MuhammadHamzaShujaat,你真的需要提供一个mcve。我同意 Brasten - typeorm 没有更新方法,但 updateOne 和 updateMany。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2021-08-11
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多