【问题标题】:Structure query based on doc field and embedded doc field while returning embedded doc返回嵌入式文档时基于文档字段和嵌入式文档字段的结构查询
【发布时间】:2012-11-15 06:05:18
【问题描述】:

我正在尝试在 mongo 数据库中查询嵌入式文档。我正在根据文档中的字段和嵌入文档中的字段进行查询。

这是一个包含几个文档的示例。

文档 1

{
  token: 'foo'
  services: [
  {
    service: 'one',
    data: {...}
  },
  {
    service: 'two',
    data: {...}
  }
  ]
}

文档 2

{
  token: 'bar'
  services: [
  {
    service: 'one',
    data: {...}
  },
  {
    service: 'two',
    data: {...}
  }
  ]
}

我想从第一个文档中获取 {service: 'one', data: {...}} 嵌入式文档。但是我不太确定如何构造查询。有什么建议吗?

【问题讨论】:

    标签: javascript mongodb database


    【解决方案1】:

    如果您有这样的集合:

       var coll =  {
          token: 'foo',
          services: [
            {
              service: 'one',
              data: {}
            },
            {
              service: 'two',
              data: {}
            }
          ]
        }
    

    您可以使用coll.services[0] 查询访问service: 'one' 对象。

    更新 如果你想按字段选择对象,你可以试试这个:

    $.grep(coll.services, function(e) { return e.service == 'one' });
    

    【讨论】:

    • 感谢您的回答。但是,这不起作用,因为我无法通过数组索引指定,我需要按字段指定。
    • 是$.grep mongodb语法还是你指的jQuery?
    【解决方案2】:

    如果 doc 1 和 doc 2 代表同一个集合中的两个文档,那么您需要通过一些明确的标识符(例如 id 或 name 等)获取第一个文档,然后从您的代码中读取 services 数组的第一个元素。

    如果 doc 1 和 doc 2 是查询的结果,并且您需要过滤匹配 {service: 'one', data: {...}} 的文档,那么因为 services 是一个数组,所以您需要使用$elemMatch。

    coll.find( { services : { $elemMatch : { service : "one", data: { ... } } } } )
    

    【讨论】:

    • 所以文档 1 和文档 2 在同一个集合中。我编写查询以获取特定文档没有问题。但是,抓取嵌入的文档是我所追求的。假设我在 doc 1 中的服务“两个”对象之后。我怎么能写一个只给我这个的查询? { 服务:'两个',数据:{...} }
    • 您需要“投影”服务字段。试试 coll.find({},{services:1})
    • 虽然你可以用 {"services.0":{..}} 查询子字段,但在当前的 mongodb 实现中你不能“投影”子字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2015-12-21
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多