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 有一个 Feed 的外键。

一句话:获取所有与数据源无关的提要

谢谢

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

并减少以过滤那些具有链接到它们的数据源文档的提要 id。例如。使用内置 _count和查询group_level

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>1在客户端或列表功能中省略记录。

编辑:具有列表功能:

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 回答