Javascript JS:$addToSet或$pull,取决于现有/缺少的值
我需要从阵列目标中添加或删除ID,具体取决于它是否已经存在。我就是这样做的: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) {
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);
现在是否更好、更清晰了?我怀疑您是否这样做,因为数据库方法实际上是异步的,因此无法以您演示的方式返回值。也许是流星?另外,我也不确定我是否遵循了你的逻辑,因为你基本上说你想在它不存在的地方添加,或者在它确实存在的时候删除,这在意图上似乎有点混乱。因此,整个过程看起来更像是伪代码,而不是真实的东西,可以用一个实际的例子来说明您需要做什么。在一个请求中当然可以执行多个操作。但我不知道你到底想做什么。你是对的,我用的是流星。忘了带标签了。是的,这是我真正的密码。我在生产中使用它,它是有效的,但感觉很糟糕,所以我想优化它。。。