1

要素がすでに配列にあるかどうかを判断するためのマングースの最速の方法は何ですか。その場合、その配列から要素を削除したいと思います。配列に追加したい特定の要素が含まれていない場合。

もちろん、追加と削除はaddToSetとremove(_id)で実行できます。クエリも問題ありません。私はこれを行うための最短の方法を、より少ない労力で本当に気にかけています。

たとえば、スキーマを取ることをお勧めします。

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. ドキュメント内の _ids を反復処理し、真偽テストを実行します。
  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 に答える