sql >> データベース >  >> NoSQL >> MongoDB

配列内のフィールドが別のフィールドと比較されるドキュメントを検索する

    引き続きaggregate()を使用できます ここではMongoDB3.2を使用していますが、 $ redact> 代わりに:

    db.boards.aggregate([
      { "$redact": {
        "$cond": {
          "if": {
            "$and": [
              { "$ne": [ "$createdBy._id", "$owner._id" ] },
              { "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
            ]
          },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }}
    ])
    

    または、 $ where MongoDB 3.2シェルの場合、 thisのスコープ付きコピーを保持する必要があります。 、そしてあなたの構文は少しずれていました:

    db.boards.find({
      "$where": function() {
        var self = this;
        return (this.createdBy._id != this.owner._id)
          && this.acl.some(function(e) {
            return e.profile._id === self.createdBy._id
         })
      }
    })
    

    または、ES6互換環境では:

    db.boards.find({
      "$where": function() {
        return (this.createdBy._id != this.owner._id)
          && this.acl.some(e => e.profile._id === this.createdBy._id)
      }
    })
    

    集約は2つの中で最もパフォーマンスの高いオプションであり、JavaScript評価を使用するよりも常に望ましいはずです

    そして、その価値については、 $expr<を使用した新しい構文です。 / code> 次のようになります:

    db.boards.find({
      "$expr": {
        "$and": [
          { "$ne": [ "$createdBy._id", "$owner._id" ] },
          { "$in": [ "$createdBy._id", "$acl.profile._id"] }
        ]
      }
    })
    

    $ inを使用する $ setIsSubsetよりも優先 構文は少し短いです。

        return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
          && this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())
    



    1. Mongooseを使用したネストされた埋め込みドキュメントのクエリ

    2. iOSからMongoDBに接続する方法(Swift)

    3. 複数の基準に一致するドキュメントを見つける方法

    4. グループ化するだけでなく、Mongoを使用して他のフィールドを表示するにはどうすればよいですか?