2017-10-24 35 views
11

Hãy nói rằng chúng tôi có một bộ sưu tập các tài liệu như thế này:Tìm nếu một phần tử trong mảng có giá trị tương đương với giá trị phần tử cha mẹ

{ 
    "_id" : ObjectId("591c54faf1c1f419a830b9cf"), 
    "fingerprint" : "3121733676", 
    "screewidth" : "1920", 
    "carts" : [ 
     { 
      "cartid" : 391796, 
      "status" : "New", 
      "cart_created" : ISODate("2017-05-17T13:50:37.388Z"), 
      "closed" : false, 
      "items" : [ 
       { 
        "brandid" : "PIR", 
        "cai" : "2259700" 
       } 
      ], 
      "updatedon" : ISODate("2017-05-17T13:51:24.252Z") 
     }, 
     { 
      "cartid" : 422907, 
      "status" : "New", 
      "cart_created" : ISODate("2017-10-23T08:57:06.846Z"), 
      "closed" : false, 
      "items" : [ 
       { 
        "brandid" : "PIR", 
        "cai" : "IrHlNdGtLfBoTlKsJaRySnM195U" 
       } 
      ], 
      "updatedon" : ISODate("2017-10-23T09:46:08.579Z") 
     } 
    ], 
    "createdon" : ISODate("2016-11-08T10:29:55.120Z"), 
    "updatedon" : ISODate("2017-10-23T09:46:29.486Z") 
} 

Làm thế nào để bạn giải nén chỉ các tài liệu mà không có mục trong mảng $. xe có $ .carts.closed đặt thành true và $.carts.updatedon lớn hơn $.updatedon trừ 3 ngày?

tôi biết làm thế nào để làm tất cả các văn bản mà không có mục nào trong mảng thoả mãn các điều kiện $and: [closed: {$eq: true}, {updatedon: {$gt : new ISODate("2017-10-20T20:15:31Z")}}]

Nhưng làm thế nào bạn có thể tham khảo các yếu tố phụ huynh $.updatedon cho việc so sánh?

Trong ngôn ngữ truy vấn vỏ đồng bằng mongodb, nó sẽ giúp bạn.

Nhưng tôi thực sự truy cập nó bằng cách sử C# tài xế, vì vậy bộ lọc truy vấn của tôi là như thế này:

FilterDefinition<_visitorData> filter; 
filter = Builders<_visitorData>.Filter 
    .Gte(f => f.updatedon, DateTime.Now.AddDays(-15)); 
filter = filter & (
    Builders<_visitorData>.Filter 
    .Exists(f => f.carts, false) 
     | !Builders<_visitorData>.Filter.ElemMatch(f => 
     f.carts, c => c.closed && c.updatedon > DateTime.Now.AddDays(-15) 
    ) 
); 

Làm thế nào tôi có thể thay thế DateTime.Now.AddDays(-15) với một tham chiếu đến phần tử gốc tài liệu updatedon?

+0

Không chắc chắn nếu tôi thiếu một cái gì đó nhưng, nếu bạn sử dụng 'f.updatedon' trong khi so sánh' c.updatedon' không hoạt động? –

+0

@VivekAthalye nope, bởi vì f không có sẵn ở bên phải của ElemMatch –

Trả lời

2

Bạn có thể dự đoán sự khác biệt của giỏ hàng.updatedon và updatedon và sau đó lọc ra các kết quả từ đường ống tổng hợp này.

coll.aggregate([{'$unwind':'$carts'}, 
       {'$match':{'closed':{'$ne':true}}}, 
       {'$project':{'carts.cartid':1,'carts.status':1,'carts.cart_created':1,'carts.closed':1,'carts.items':1,'carts.updatedon':1,'updatedon':1,'diff':{'$subtract':['$carts.updatedon','$createdon']}}}, 
       {'$match': {'diff': {'$gte': 1000 * 60 * 60 * 24 * days}}}]) 

ngày = 3 sẽ lọc kết quả hơn 3 ngày tài liệu khác biệt.

Tôi vừa đưa ra ví dụ về cách bạn có thể sử dụng $ trừ để tìm sự khác biệt ngày tháng và các tài liệu lọc dựa trên đó.

1

Tôi cũng ở trong tình huống tương tự vài ngày trước. Tôi đã giải quyết nó bằng cách sử dụng Jobject của Newtonsoft.Json. Tạo một hàm để trả về bool thực sự xử lý mỗi tài liệu lấy nó làm đầu vào.

Jobject jOb=Jobject.parse(<Your document string>); 
    JArray jAr=JArray.Parse(jOb["carts"]); 
    If(jOb["updateon"]=<Your Business Validation>) 
    { 
    foreach(var item in jAr) 
     if(item["closed"]==<Your validation>){ return true}   

    } 
return false; 

Tôi hy vọng điều này sẽ giúp :) Nếu bạn xử lý với bất kỳ giá trị null nào trong các thuộc tính đó, vui lòng sử dụng Tryparse và biến ngoài.

Các vấn đề liên quan