首页 > 解决方案 > 查询同类型嵌套文档的Mongo集合

问题描述

我有一个不那么独特的要求,但我只是在寻找正确的术语进行搜索,因为我只不断获得有关如何查询列表/数组字段或嵌套元素的结果。

这是我的课程(文档类型)...

public class Item {
    private String identity     = null;
    private String name         = null;
    private String type         = null;
    private List<Item> grouping = null;
}

因此,这方面的一些实体实例type可能会变得复杂,如下所示......

{
   "identity":"ITEM-1",
   "name":"Pack-1",
   "type":"Bundle",
   "grouping":[
      {
         "identity":"ITEM-2",
         "name":"Book",
         "type":"Atomic Unit"
      },
      {
         "identity":"ITEM-3",
         "name":"Stationary",
         "type":"Bundle",
         "grouping":[
            {
               "identity":"ITEM-4",
               "name":"Pen",
               "type":"Atomic Unit"
            },
            {
               "identity":"ITEM-5",
               "name":"Paper",
               "type":"Atomic Unit"
            },
            {
               "identity":"ITEM-6",
               "name":"Paraphernalia",
               "type":"Bundle",
               "grouping":[
                  {
                     "identity":"ITEM-7",
                     "name":"Eraser",
                     "type":"Atomic Unit"
                  },
                  {
                     "identity":"ITEM-8",
                     "name":"Ruler",
                     "type":"Atomic Unit"
                  },
                  {
                     "identity":"ITEM-9",
                     "name":"Compass",
                     "type":"Atomic Unit"
                  }
               ]
            }
         ]
      }
   ]
}

现在我的要求是能够搜索Bookor PenorCompass并且必须能够获取记录ITEM-1。如何在 Mongo Query 中实现这一点。我在我的数据抽象服务层上使用 Spring Data Mongo Repository 方法。

提前感谢所有帮助。

标签: mongodbmongodb-queryspring-data

解决方案


我的要求是能够搜索书籍或笔或指南针,并且必须能够获取记录 ITEM-1。

您可以从 shell 尝试此查询mongo,它会获取文档:

var SEARCH_ITEMS = [ "Book", "Pen", "Compass" ]
var ATOMIC = "Atomic Unit"

db.collection.find( {
  $or: [
    { "type": ATOMIC, name: { $in: SEARCH_ITEMS } },
    { "grouping.type": ATOMIC, "grouping.name": { $in: SEARCH_ITEMS } },
    { "grouping.grouping.type": ATOMIC, "grouping.grouping.name": { $in: SEARCH_ITEMS } },
    { "grouping.grouping.grouping.type": ATOMIC, "grouping.grouping.grouping.name": { $in: SEARCH_ITEMS } }
  ]
} )

推荐阅读