7

次の LinQ クエリに相当する CouchDB JS ビューを探しています。

    var query =
        from f in context.Feed
        where !(from ds in context.DataSource
                select ds.Feed_ID)
        .Contains(f.ID)
        select f;

DataSources が Feeds への外部キーを持つ場所。

つまり、DataSource に関連付けられていないすべてのフィードを取得します。

ありがとうございました

4

3 に答える 3

2

ビュー照合を使用して、マップ内のフィードとデータ ソースを結合できます。

function(doc) {
  if (!doc.type) return;
  if (doc.type == "feed") emit(doc._id, null);
  if (doc.type == "ds" && doc.feed) emit(doc.feed, null);
}

reduce を使用して、データ ソース ドキュメントがリンクしているフィード ID をフィルター処理します。例えば。group_level を使用した組み込み_countとクエリの使用:

http://127.0.0.1:5984/test/_design/join/_view/not_in?group_level=1

データベースの場合:

{"id":"1", "type":"feed"}
{"id":"2", "type":"feed"}
{"id":"3", "type":"ds", "feed":1}
{"id":"4", "type":"ds", "feed":1}}

あなたに与える:

{"rows":[
{"key":"1","value":3},
{"key":"2","value":1}
]}

>1は、データ ソースからの参照を持つフィード ドキュメントです。データソースのない純粋なフィード リストを取得するには、value>1in client またはlist 関数でレコードを省略できます。

編集:リスト機能付き:

function(head, req) {
  var row;
  while (row = getRow()) {
    if (row.value == 1)
      send(row.key + "\n");
  }
}

およびクエリ:

http://127.0.0.1:5984/test/_design/join/_list/not_ds/not_in?group_level=1

データ ソースからの参照なしで、フィード ドキュメントを使用して最終結果を取得します。これは ID のリストを含むプレーン テキストであり、JSON 配列用にフォーマットすることもできます。

于 2013-01-19T15:36:03.317 に答える
0

Sql NOT IN に相当する CouchDB に対する率直な答えは、次のとおりです。相当するものはありません。Couchdb ビュー APIには、NOT IN のクエリ オプションはありません。

ただし、データソースに関連付けられていないフィードを取得するか、特定のデータソースに関連付けられていないフィードを取得するかに応じて、目的を達成する別の方法がある場合があります。

于 2013-01-19T18:15:39.487 に答える
0

これは古い投稿であることは知っていますが、同じ問題に直面しているため、Marcinの答えは正しいが不完全だと思います。

私の場合、次のリスト関数を使用して、特定のexcludeIdを持つ行を除くすべての行を選択して取得しました。

function(head, req) {
start({ 'headers': { 'Content-Type': 'application/json' } });
 var rows = [];
 while (row = getRow()) {
    if (!req.query.exceptId || doc.documentId != req.query.exceptId) {
        rows.push(row);
    }
 }
 send(JSON.stringify({ total_rows: rows.length, rows: rows }));
}

ここでもっと読むことができます

于 2016-06-23T17:40:54.670 に答える