CouchDB相当于Sql NOT IN?

use*_*761 6 couchdb join contains notin

我正在寻找相当于以下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;
Run Code Online (Sandbox Code Playgroud)

DataSources具有Feeds的外键的位置.

总而言之:获取与DataSource无关的所有Feed

谢谢

Mar*_*ski 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);
}
Run Code Online (Sandbox Code Playgroud)

并减少过滤那些具有链接到它们的数据源文档的提要 ID。例如。使用内置函数 _count并通过group_level进行查询:

http://127.0.0.1:5984/test/_design/join/_view/not_in?group_level=1
Run Code Online (Sandbox Code Playgroud)

对于数据库:

{"id":"1", "type":"feed"}
{"id":"2", "type":"feed"}
{"id":"3", "type":"ds", "feed":1}
{"id":"4", "type":"ds", "feed":1}}
Run Code Online (Sandbox Code Playgroud)

会给你:

{"rows":[
{"key":"1","value":3},
{"key":"2","value":1}
]}
Run Code Online (Sandbox Code Playgroud)

>1是那些引用数据源的提要文档。value>1要获得不带数据源的纯提要列表,您可以在客户端或列表函数中省略记录。

编辑:具有列表功能:

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

并查询:

http://127.0.0.1:5984/test/_design/join/_list/not_ds/not_in?group_level=1
Run Code Online (Sandbox Code Playgroud)

您将通过提要文档获得最终结果,而无需参考数据源。它是带有 id 列表的纯文本,您也可以将其格式化为 JSON 数组。