用猫鼬将值推入数组

时间:2018-11-13 19:29:25

标签: node.js mongodb mongoose

使用猫鼬将值推入数组时遇到了问题(是的,我已经阅读了很多有关它的主题,并尝试了许多方法来实现)。

所以我有这个模式

const Postit = new Schema({
    text: {
        type: String,
        required: true
    },
    status: {
        type: String,
        default: 'TODO'
    },
    modified: {
        type: Date,
        default: Date.now
    },
    user: {
        type: ObjectId,
        ref: 'User',
        required: true
    },
    collaborators: [String]
})

我正在尝试在查询匹配的collaborators属性中推送一个字符串。

这是我用来更新它的方法

addCollaborator(uid, pid) {
  return Postit.updateOne({
    _id: pid, 
    user: uid 
  }, 
  { $push: { collaborators: 'pepe' } }, 
  (err, raw) => {
    //TO DO
  })
}

但是什么也没发生。该查询之所以匹配,是因为如果我将$ set的$ push更改并为status属性添加新值,例如它会更新。

有趣的是,如果我在mongodb客户端中运行它,那么它将起作用。

db.postits.updateOne({
  _id: ObjectId("5beb1492cf484233f8e21ac1"), 
  user: ObjectId("5beb1492cf484233f8e21abf")
}, 
  { $push: {collaborators: 'pepe' }
})

我做错了什么?

2 个答案:

答案 0 :(得分:0)

选择promisescallbacks,但不要将它们混合在一起。您可以这样做:

addCollaborator(uid, pid) {
  Postit.updateOne({
    _id: mongoose.Types.ObjectId(pid), 
    user: uid 
  }, 
  { $push: { collaborators: 'pepe' } }, 
  (err, raw) => {
    // TO DO
  })
}

或者您这样做:

addCollaborator(uid, pid) {
  return Postit.updateOne({
    _id: mongoose.Types.ObjectId(pid), 
    user: uid 
  }, 
  { $push: { collaborators: 'pepe' } }).exec()
  .then(result => {
    // TO DO
  })
}

还要确保您的objectId是实际的mongoose.Types.ObjectId

答案 1 :(得分:0)

好的,问题是我使用的是旧模式。

该代码运行完美。今天足够的代码...