CreateIndex с массивами вложенных объектов с возможностью поиска - PullRequest
2 голосов
/ 30 сентября 2019

Кто-нибудь знает, как я могу создать индекс, в котором термин является ссылкой и доступен для поиска через вложенный объект в массиве?

В коллекции "разговоры" я сохранил следующие данные примера:

{
  "created": Time("2019-09-29T22:11:01.493034Z"),
  "updated": Time("2019-09-29T22:11:01.493034Z"),
  "participants": [
    {
      "ref": Ref(Collection("users"), "244754936642929163"),
      "firstname": "John",
      "creator": true
    },
    {
      "ref": Ref(Collection("users"), "244517629884105216"),
      "firstname": "Max"
    }
  ]
}

Было бы здорово иметь индекс, где я могу искать, если ссылка включена в массив участников.

1 Ответ

2 голосов
/ 30 сентября 2019

Это можно решить с помощью индекса с массивом, выбранным в качестве термина. Когда поле, предназначенное для термина, является массивом, создается отдельная запись индекса на элемент массива. Таким образом, если предположить, что существующие коллекции parent и child, то

db> CreateIndex({name: "cs", source: Collection("parent"), terms: [{field: ["data", "child"]}]})
{
  ref: Index("cs"),
  ts: 1569831659780000,
  active: true,
  serialized: true,
  name: 'p',
  source: Collection("parent"),
  terms: [ { field: [ 'data', 'child' ] } ],
  partitions: 1
}

будет работать. Пример использования:

db> Create(Collection("child"), {})
{
  ref: Ref(Collection("child"), "244918886014648845"),
  ts: 1569831701200000
}
db> Create(Collection("child"), {})
{
  ref: Ref(Collection("child"), "244918887478460941"),
  ts: 1569831702590000
}
db> Create(Collection("parent"), {data:{child:[Ref(Collection("child"), "244918886014648845"), Ref(Collection("child"), "244918887478460941")]}})
{
  ref: Ref(Collection("parent"), "244918956982272520"),
  ts: 1569831768880000,
  data: {
    child: [
      Ref(Collection("child"), "244918886014648845"),
      Ref(Collection("child"), "244918887478460941")
    ]
  }
}
db> Paginate(Match(Index("cs"), Ref(Collection("child"), "244918886014648845")))
{
  data: [
    Ref(Collection("parent"), "244918956982272520")
  ]
}

Любой из дочерних ссылок соответствовал бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...