Запрос, который вы хотите, следующий:
db.collection.find({"users":{"$not":{"$elemMatch":{"user":{$nin:[1,5,7]}}}}})
Это говорит, что найти все документы, которые не имеют элементов, которые находятся за пределами списка 1,5,7.
Я должен признать, что я никогда не пробовал это лично.
Однако я вспомнил, что обычный подход к предотвращению состязаний в файловом вводе / выводе состоит в том, чтобы попытаться обработать случай возможной ошибки соответственно.
Следовательно, я посмотрел в QFile::open()
, что он предлагает и нашел:
QIODevice::NewOnly
: [1111 ]
Ошибка, если открываемый файл уже существует. Создайте и откройте файл, только если он не существует. Существует гарантия от операционной системы, что вы единственный, кто создает и открывает файл. Обратите внимание, что этот режим подразумевает WriteOnly, и его комбинирование с ReadWrite разрешено. Этот флаг в настоящее время влияет только на QFile. Другие классы могут использовать этот флаг в будущем, но до тех пор использование этого флага с любыми классами, кроме QFile, может привести к неопределенному поведению. (начиная с Qt 5.11)
blockquote>
Я только что понял (помимо нашей производительной установки Qt 5.9) у меня есть более новая, которую я установил для приватной игры.
Таким образом, я сделал небольшую выборку, чтобы проверить это:
#include <QtWidgets> int main() { qDebug() << "Qt Version:" << QT_VERSION_STR; for (int i = 1; i <= 2; ++i) { qDebug() << "Iteration" << i; QFile qFile("test.txt"); if (!qFile.open(QIODevice::WriteOnly | QIODevice::NewOnly)) { qDebug() << "qFile.open failed! Error code" << qFile.error(); } qFile.write("test"); qFile.close(); } return 0; }
Вывод:
Qt Version: 5.11.2 Iteration 1 Iteration 2 qFile.open failed! Error code 5 QIODevice::write (QFile, "test.txt"): device not open
Я все еще не совсем уверен, как выяснить, что это не удалось именно из-за уже существующего файла (а не по любой другой причине). В моем случае точно, но в целом?
(Код ошибки 5 - просто
QFileDevice::OpenError
.)