【问题标题】:Extracting value from nested array in Mongoose从 Mongoose 的嵌套数组中提取值
【发布时间】:2013-01-17 01:45:16
【问题描述】:

我是第一次与 Mongoose 合作,我正在努力完成看似简单的任务。我有一个包含clients 属性的用户文档,该属性由一组客户端ID 组成。例如,我的文档如下所示:

{
  email: "nick@movementstrategy.com",
  password: "$2a$10$xZVzMYgyoyT.biOMDrBlRe3HNHY5A6lXga6uc8b/cnIAX/khQ7ep2",
  modified: ISODate("2013-01-16T00:13:56.894Z"),
  created: ISODate("2013-01-16T00:13:56.894Z"),
  _id: ObjectId("50f5f0c4d6bbbcc6ce000002"),
  clients: [
    "50f6e118e0ccf9a1e9000001",
    "50f6e12be0ccf9a1e9000002"
  ],
  __v: 0
}

我创建了一个中间件,当我调用 remove() 时,它会删除客户端的依赖项;

clientSchema.pre('remove', function(next) {

    Sweepstakes.remove({client_id: this._id}).exec();
    Submission.remove({client_id: this._id}).exec();

    // find users with this._id present in clients, and remove from array

    next();

});

现在,我只需要找到所有在 clients 中存在客户端 ID 的用户,删除该 ID,然后更新用户。

我知道我可以轻松地查询所有存在 id 的用户,然后循环遍历并分别保存每个用户...但这似乎效率低下,我的直觉告诉我有更好的方法来完成我正在尝试做——只是很难在文档中找到它。

使用 Mongoose 最有效的方法是什么?

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

大概是这样的:

Users.update({condition}, {$pull : { clients: this._id} }, function(err, numAffected) {
    //handle errors and whatever
    next();
});

您可以将clients : {$in : [this._id]} 添加为condition 以限制更新。

【讨论】:

  • 我试了一下,它没有抛出任何错误。回到 0 行受影响,并且 id 没有从 clients 数组中删除。我仔细检查了上面提供的 JohhnyHK 的文档,看起来我的条件设置正确。您是否有机会查看我修改后的代码并查看/如果我遗漏了什么? GIST
  • @NickParsons 对我来说看起来不错。我建议在即使是单语句 if 分支周围也放置保护性大括号,
  • 我缩小了范围。 clients 数组中的 id 似乎必须是 ObjectId 类型。我手动将它们作为字符串放入我的clients 数组中。我的架构或创建函数发生了一些事情,不允许将它们转换为 ObjectId。调试开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多