1

猫鼬确定元素是否已经在数组中的最快方法是什么。在这种情况下,我想从该数组中删除元素。如果数组不包含我要添加的特定元素。

当然添加和删除可以通过 addToSet 和 remove(_id) 来完成。查询也没有问题。我真的更关心做到这一点的最短方法,用更少的努力。

例如,我建议采用 Schema:

var StackSchema = new Schema({
    references: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});

假设引用数组包含以下元素:

['5146014632B69A212E000001',
 '5146014632B69A212E000002',
 '5146014632B69A212E000003']

案例 1:我的方法收到 5146014632B69A212E000002 (所以应该删除这个条目。)

案例2:我的方法收到5146014632B69A212E000004(所以应该添加这个条目。)

4

3 回答 3

2

任何路过的人的解决方案。:)

if(doc.references.indexOf(SOMESTRING) !== -1) {
    console.log('it\'s there') ; doc.likes.pull(SOMESTRING);
}else{
    doc.references.push(SOMESTRING);
}
于 2013-09-15T22:57:18.680 回答
0

这是逻辑,下面有代码。

我通常使用 underscore.js 来完成这样的任务,但你可以只用 JavaScript 来完成。

  1. 获取文档。
  2. 遍历文档中的 _id,执行真值测试。
  3. 如果文档具有您正在测试的 _id,请从数组中删除当前索引。
  4. 如果您已经浏览了整个数组并且其中没有任何内容,array.push()则_id。然后document.save()

这是我通常遵循的方法。

在下划线中,它会是这样的:

function matching(a,b) { // a should be your _id, and b the array/document
  var i;
  for ( i = 0, i < b.length , i++) {
    if ( a.toString() === b[i].toString() )
      return i;
    else return -1;
  }
};

然后你会使用这个函数:

var index = matching( '5146014632B69A212E000002', doc );
if ( index > -1 )
  doc.splice( index , 1);
else 
  doc.push( '5146014632B69A212E000002' );
于 2013-03-22T13:04:39.117 回答
0

@Hussein 回答,但使用 Lodash:

const _ = require("lodash")

const User = require("./model")

const movies = ["Inception", "Matrix"]

(async () => {
    // Catch errors here
    const user = User.findById("")

    const userMoviesToggle = _.xor(
        user.movies, // ["Inception"]
        movies
    ); // ["Matrix"]

    user.movies = userMoviesToggle

    // Catch errors here
    user.save()
})()
于 2020-04-15T04:38:22.467 回答