MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

So sánh các mảng và trả về sự khác biệt

Những thứ duy nhất "sửa đổi" tài liệu trong phản hồi là .aggregate().mapReduce() , trong đó cái trước là lựa chọn tốt hơn.

Trong trường hợp đó, bạn đang yêu cầu $setDifference so sánh "bộ" và trả về "sự khác biệt" giữa hai bộ.

Vì vậy, đại diện cho một tài liệu với mảng của bạn:

db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })

Chạy tổng hợp:

db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])

Trả về:

{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }

Nếu bạn không muốn "tập hợp" và thay vào đó muốn cung cấp một mảng như [2,3,4,4] thì bạn có thể so sánh với $filter$in thay vào đó, nếu bạn có MongoDB 3.4 ít nhất:

db.collection.aggregate([
  { "$project": {
    "c": {
      "$filter": {
        "input": [2,3,4,4],
        "as": "a",
        "cond": {
          "$not": { "$in": [ "$$a", "$b" ]  }
        }
      }
    }   
  }}
])

Hoặc với $filter$anyElementTrue trong các phiên bản trước:

db.collection.aggregate([
  { "$project": {
    "c": {
      "$filter": {
        "input": [2,3,4,4],
        "as": "a",
        "cond": {
          "$not": {
            "$anyElementTrue": {
              "$map": {
                "input": "$b",
                "as": "b",
                "in": {
                  "$eq": [ "$$a", "$$b" ]    
                }
              }    
            }
          }
        }    
      }
    }    
  }}
])

Nơi cả hai sẽ trở về:

{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }

Tất nhiên là "không phải là một tập hợp" vì 4 đã được cung cấp dưới dạng đầu vào "hai lần" và do đó cũng được trả về "hai lần".




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose lỗi khóa trùng lặp với nâng cấp

  2. Phân trang dữ liệu mùa xuân mongo

  3. Có ai đã thử MongoDB trên Google App Engine không?

  4. 4 cách liệt kê các bộ sưu tập trong cơ sở dữ liệu MongoDB

  5. Mongoose giới hạn / bù đắp và truy vấn đếm