#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
не выполняет соответствие равенству массива, он проверяет, что каждый из элементов в запросе находится в массиве документов. Он также будет соответствовать, если массив документа содержит дополнительные элементы.