JS:$ addToSet或$ pull取决于现有/缺失值

时间:2017-07-18 21:08:30

标签: javascript mongodb meteor

我需要在数组(target)中添加或删除ID,具体取决于它是否已存在。这就是我这样做的方式:

var isExisting = Articles.findOne({ _id }).target.indexOf(mID) > -1

if (isExisting === false) {
  Articles.update(
      { _id },
      { $addToSet: { target: mID } }
    )
} else if (isExisting === true) {
  Articles.update(
    { _id },
    { $pull: { target: mID } }
  )
}

是否有可能以更好的方式做到这一点 - 不用if / else和min。两个db操作?

2 个答案:

答案 0 :(得分:0)

Mongoose操作是异步的,因此您需要等待其回调才能获取文档。

// find the article by its ID
Articles.findById(_id, function (err, article) {
    // make appropriate change depending on whether mID exist in the article's target
    if (article.target.indexOf(mID) > -1)
        article.target.pull(mID)
    else
        article.target.push(mID)
    // commit the change
    article.save(function (err) {

    });
})

虽然你正在做if / else,但你正在进行2次操作。

答案 1 :(得分:-1)

这是我的建议

let isExisting = Articles.findOne({ _id: _id, target : mID}) //mongo can search for mID in array of [mIDs]
let query = { _id : _id };
let update = isExisting ? { $pull: { target: mID } } : { $addToSet: { target: mID } };

Articles.update(query, update);

现在更好更清楚了吗?