2017-10-24 22 views
11

は、我々はこのような文書のコレクションを持っているとしましょうました:場合は検索配列の要素は親要素の値に等しい値

{ 
    "_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") 
} 

あなたは配列$でいない項目のみの文書を抽出するにはどうすればよいです。カートは$ .carts.closedがtrueに設定され、$.carts.updatedon$.updatedonマイナス3日を超えていますか?

は、私は、配列には項目が条件$and: [closed: {$eq: true}, {updatedon: {$gt : new ISODate("2017-10-20T20:15:31Z")}}]

を満たしていないしかし、どのようにあなたが比較のために、親要素$.updatedonを参照することができ、すべてのドキュメントを検索する方法を知っていますか?

普通のmongodbシェルクエリ言語では、それは助けになるでしょう。

しかし、私のクエリフィルタはこのようなものですので、私は実際には、C#のドライバを使用してアクセスしています:

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) 
    ) 
); 

どのように私は、文書のルート要素updatedonを参照してDateTime.Now.AddDays(-15)を置き換えることができますか?

+0

私は何かが不足しているのかどうかは分かりませんが、 'f.updatedon'を' c.updatedon'と比較して使用しても動作しないのであれば、 –

+0

@VivekAthalyeは、ElemMatchの右側にfがありません –

答えて

2

carts.updatedonとupdatedonの違いをプロジェクションして、この集計パイプラインの結果をフィルタすることができます。

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}}}]) 

日= 3は、3日以上の差異文書をフィルタリングします。

ここでは、$ subtractを使用して日付の差分を見つけ、それに基づいてドキュメントをフィルタする方法の例を示しました。

1

よく私は数日前に同様の状況にあった。 私はNewtonsoft.JsonのJobjectを使ってそれに取り組んだ。 実際に各文書を処理するboolを返す関数を作成し、入力として取得します。

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; 

私はこれが役に立てば幸い:) あなたはこれらのプロパティのいずれかのNULL値を扱う場合は、Tryparseとアウト変数を使用してください。

関連する問題