проблема с обновлением php mongo

#php #mongodb

#php #mongodb

Вопрос:

Я использую этот пакет https://github.com/jenssegers/laravel-mongodb#mongodb-specific-operations чтобы разобраться с монго в проекте, над которым я работаю.

У меня есть коллекция с такой структурой (вот пример одного документа)

  { 
        "_id" : ObjectId("5fda3a602279e5262a3ddec6"), 
        "type" : "type", 
        "tags" : [
            "tag1", 
            "tag2",
        ], 
        "filters" : [
            {
                "key" : "1", 
                "label" : "some key1"
            }, 
            {
                "key" : "2", 
                "label" : "some key2"
            }
        ], 
        "updated_at" : ISODate("2020-12-16T16:48:32.000 0000"), 
        "created_at" : ISODate("2020-12-16T16:48:32.000 0000")
    },
 

что мне нужно сделать, так это проверить, есть ли в коллекции документ с тем же типом и теми же тегами, что и при условии, если да, мне нужно обновить этот документ, если не создать его.

Вот код, который я написал:

      $this->collection->where('type', $type)
            ->where('tags', 'all', $tags)
            ->update(
                ['type' => $type, 'tags' => $tags, 'filters' => $filters,],
                ['upsert' => true,]
            );
 

здесь я проверяю, есть ли у нас документ с типом, равным $type и тегами, такими же, как $tags , если такой документ существует, я его обновляю (заменяю все данные на новые), если нет, он должен создать новый документ, благодаря ['upsert' => true,]

Но когда я запускаю его, я получаю сообщение об ошибке cannot infer query fields to set, path 'tags' is matched twice

К вашему сведению: когда я удаляю ->where('tags', 'all', $tags) запрос, он работает, не уверен, что он правильный, но он не сбой

Также я пытался сделать это следующим образом: ->where('tags', ['$all' => $tags]) и проблема такая же, как указано выше

Обновлено это происходит только тогда, когда он пытается вставить новое поле, обновления работают корректно

Комментарии:

1. Где документация по операциям, которые вы используете, и что в ней говорится о правильном использовании?

2. вот документация по all использованию в php libray — github.com/jenssegers /. … Вот использование php для upsert — github.com/jenssegers /… . Вот документация mongo о all docs.mongodb.com/manual/reference/operator/query/all , а вот для upsert — docs.mongodb.com/manual/reference/method/db.collection.update (поиск по ключевому слову upsert)

3. all не выполняет соответствие равенству массива, он проверяет, что каждый из элементов в запросе находится в массиве документов. Он также будет соответствовать, если массив документа содержит дополнительные элементы.