Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:$addToSet或$pull,取决于现有/缺少的值_Javascript_Mongodb_Meteor - Fatal编程技术网

Javascript JS:$addToSet或$pull,取决于现有/缺少的值

Javascript JS:$addToSet或$pull,取决于现有/缺少的值,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我需要从阵列目标中添加或删除ID,具体取决于它是否已经存在。我就是这样做的: var isExisting = Articles.findOne({ _id }).target.indexOf(mID) > -1 if (isExisting === false) { Articles.update( { _id }, { $addToSet: { target: mID } } ) } else if (isExisting === true) {

我需要从阵列目标中添加或删除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操作?

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,但您正在执行两个操作。

以下是我的建议

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);

现在是否更好、更清晰了?

我怀疑您是否这样做,因为数据库方法实际上是异步的,因此无法以您演示的方式返回值。也许是流星?另外,我也不确定我是否遵循了你的逻辑,因为你基本上说你想在它不存在的地方添加,或者在它确实存在的时候删除,这在意图上似乎有点混乱。因此,整个过程看起来更像是伪代码,而不是真实的东西,可以用一个实际的例子来说明您需要做什么。在一个请求中当然可以执行多个操作。但我不知道你到底想做什么。你是对的,我用的是流星。忘了带标签了。是的,这是我真正的密码。我在生产中使用它,它是有效的,但感觉很糟糕,所以我想优化它。。。