【问题标题】:MongoDB move ObjectId from one field to anotherMongoDB 将 ObjectId 从一个字段移动到另一个字段
【发布时间】:2019-09-16 12:29:30
【问题描述】:

问题

我在字段 -incomingFriendRequests- 中保存了一个 ObjectId,我想将其移动到另一个字段 -friends-。

有没有比从 receivedFriendRequests 中删除它然后执行 findOneAndUpdate 将其添加给朋友更好的方法?我觉得这可以通过一个数据库调用而不是两个来完成。

代码

猫鼬模型:

const userSchema = mongoose.Schema({ 
  friends: [{
    type: mongoose.Schema.Types.ObjectId, ref: 'User', require: false
  }],
  incomingFriendRequests:[{
    type: mongoose.Schema.Types.ObjectId, ref: 'User', require: false
  }],
  online: {type: Boolean, require: true}
});

【问题讨论】:

  • 你想对所有文档运行一次还是只对一个特定的文档运行一次?

标签: javascript database mongodb mongoose


【解决方案1】:

不可能在单个查询中首先对incomingFriendRequests 字段执行$pull 以删除选定的objectId,然后您需要对好友执行另一个更新查询以添加选定的objectId。此外,您可以使用 $addToSet 来防止重复 ID。如果您使用 $push 在这种情况下添加重复的 objectId 也存储。

查询:-

1) 删除:- db.getCollection('testdata').update({id:ObjectId('5cc3fa66a04275096417f9ca')},{"$pull":{"incomingFriendRequests":"5cc3fa66a04275096417f9da"}}});

2) 添加:- db.getCollection('testdata').update({id:ObjectId('5cc3fa66a04275096417f9ca')},{"$addToSet":{"friends":"5cc3fa66a04275096417f9da"}}); // 你也可以使用 $push

【讨论】:

    【解决方案2】:

    将值从一个字段移动到另一个字段肯定需要 n + 1 次调用来进行转换。这可以使用

    来实现
    find({}).forEach(function(doc) {
      // your doc update
      doc.save();
    });
    

    或者您甚至可以执行批量写入。

    如果您的目标是删除incomingFriendRequests 列,您可以将该列重命名为friends,而不是复制所有数据。

    update({}, { $rename: {incomingFriendRequests: friends }});
    

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多