可以使用猫鼬从引用对象的数组中提取元素吗?

时间:2018-09-26 14:12:35

标签: node.js mongodb mongoose mongoose-schema mongoose-populate

我有2个使用ObjectId相互关联的mongo模式:

var User = new Schema({
    username: {
      type:String,
      unique: true
    },
    password: { 
        type:String
    },
    verified:   {
        type: Boolean,
        default: false
    },
    lastActivity:{
      type:Date,
      default:Date.now
    }
});

还有一个watitingRoom模式,其中列出了所有users

var WaitingRoom = new Schema({
    lastActivity:{
          type:Date,
          default:Date.now
    },
    clients: [{
        type : mongoose.Schema.ObjectId,
        ref: 'User'
    }],
    videocalls: [{
        type: mongoose.Schema.ObjectId,
        ref:'VideoCall'
    }]
});

因此,我想“刷新”我的clients数组,以拉出比当前时间少lastActivity的所有客户端。我使用$pull中提供的mongoose工具进行了尝试。谷歌搜索并混合了不同的示例后,我尝试了以下操作:

WaitingRoom.findOneAndUpdate({}, { lastActivity: new Date(),
                                      $pull : {clients : {"clients.lastActivity": { $lt: new Date() }}}
                                     }, options)
    .populate("clients")
    .exec( function(error, waitingRoom) {
            if (err) { return res.status(500).send({ msg: err.message }); }

    })

找到唯一的候诊室,更新lastActivity字段,并尝试拉出所有clients.lastActivity少于当前日期的客户端。

(显然,此代码片段无效)

问题是我没有找到任何文档或示例来说明是否有可能使用嵌套条件ObjectId

从引用的clients.lastActivity模式中提取元素

1 个答案:

答案 0 :(得分:1)

您需要先从User数据库中找到ID,然后再从$pull数据库中WaitingRoom中找到它们

User.find({ lastActivity: new Date() }).then((users) => {
  const ids = []
  users.map((user) => {
    ids.push(user._id)
  })
  WaitingRoom.update({}, { $pull: { clients: ids }}, { multi: true }).then(() => {
    console.log('removed')
  })
})