首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JSdata -查询以匹配数组中的所有项(MongoDB '$all‘关键字)

JSdata -查询以匹配数组中的所有项(MongoDB '$all‘关键字)
EN

Stack Overflow用户
提问于 2017-05-16 20:31:15
回答 2查看 80关注 0票数 0

我正在使用jsdata为Angular 1.5 web应用程序创建本地缓存。我用相应的关系对我的数据进行建模,一切都很好。我正在努力处理一个查询,我甚至不确定这是否适用于js-data:

假设我有一个具有ID和名称的标签集合

代码语言:javascript
运行
复制
 [
  {
    "id": 1,
    "name": "Tag 1"
  },
  {
    "id": 2,
    "name": "Tag 2"
  }
  ,
  {
    "id": 3,
    "name": "Tag 3"
  }
]

和一些已经分配了标签的帖子:

代码语言:javascript
运行
复制
[   {
      "id": 1,
      "name": "Post with tags 1 and 2",
      "tags": [1, 2]
    },
    {
      "id": 2,
      "name": "Post with tags 2 and 3",
      "tags": [2,3]
    },
    {
      "id": 3,
      "name": "Post with tag 3",
      "tags": [3]
    }
]

然后我定义了一个标记和Post数据存储,并在Post上设置了一个hasMany关系:

代码语言:javascript
运行
复制
relations: {
hasMany: {
  tag: {
    localField: 'embedded_tags',
    localKeys: 'tags'
  }
}

当我查询帖子时,我看到我的标签出现在embedded_tags中,所以没问题。我现在想将我的帖子过滤到一组特定的标签:比方说,我只想看到标签为2和3的帖子,即帖子2。

显然,这不起作用:

代码语言:javascript
运行
复制
var resultISect = postDS.filter({
  where: {
    'tags': {
      'iSectNotEmpty': [1, 2]
    }
  }
})

这也没有(当然还抛出了一个重复的键警告):

代码语言:javascript
运行
复制
var resultAnd = postDS.filter({
  where: {
    'tags': {
      'contains': 3,
      'contains': 2
    }
  }
})

在MongoDB / Mongoose中有一个关键字$all,它就是这样做的。在jsData中有没有像这样的过滤方法,或者这是不是太多的数据库任务,应该在后端完成-我想避免这样的情况,因为这或多或少就是拥有本地缓存副本的全部意义,对吧?

Plunkr:http://plnkr.co/edit/M44V8js0BtZaK6Xq9CYt?p=preview

EN

回答 2

Stack Overflow用户

发布于 2017-05-19 23:09:51

我给js-data _utils2.default添加了一个'matchAll‘函数。这对现在来说是有效的,也许对某些人有帮助。

将此函数添加到intersection- function旁边:

代码语言:javascript
运行
复制
// check if array contains all elements queried
function matchAll(arr, elements) {

    if (!arr || !elements) {
        return true;
    }

    for (var i = 0, length = elements.length; i < length; i++) {
        if (contains(arr, elements[i])) {
            continue;
        } else {
            return false;
        }
    }
    return true;
}

将此函数与其他函数一起公开:

代码语言:javascript
运行
复制
exports.default = {
    ...
    guid: guid,
    intersection: intersection,
    matchAll: matchAll,
    isArray: isArray,
    isBlacklisted: isBlacklisted,
    ...
}

并让它对新的关键字做出反应:

代码语言:javascript
运行
复制
...
} else if (op === 'isectEmpty') {
    expr = !_utils2.default.intersection(val || [], term || []).length;
} else if (op === 'isectNotEmpty') {
    expr = _utils2.default.intersection(val || [], term || []).length;
} else if (op === 'matchAll') {
    expr = _utils2.default.matchAll(val || [], term || []);
} else if (op === 'in') {
...
票数 0
EN

Stack Overflow用户

发布于 2017-05-29 23:14:29

“‘where”可以是一个数组,这应该是可行的:

代码语言:javascript
运行
复制
where: [
  {
    tags: {
      contains: 3
    }
  },
  'and'
  {
    tags: {
      contains: 2
    }
  }
]

取自:https://github.com/js-data/js-data/blob/c3fcde1abab910cdf4d39e3fbc42699a3b27c1da/test/unit/query/filter.test.js#L243 (发现所有过滤器特性的好地方,顺便说一下)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44001572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档