Я считаю, что это самый быстрый запрос, который отвечает на ваш вопрос, потому что он не использует интерпретированное предложение $where
:
{$nor: [
{name: {$exists: false}},
{name: {$size: 0}},
{name: {$size: 1}}
]}
Это означает «все документы, кроме тех, которые не имеют имени (либо несуществующий или пустой массив) или только с одним именем. "
Тест:
> db.test.save({})
> db.test.save({name: []})
> db.test.save({name: ['George']})
> db.test.save({name: ['George', 'Raymond']})
> db.test.save({name: ['George', 'Raymond', 'Richard']})
> db.test.save({name: ['George', 'Raymond', 'Richard', 'Martin']})
> db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]})
{ "_id" : ObjectId("511907e3fb13145a3d2e225b"), "name" : [ "George", "Raymond" ] }
{ "_id" : ObjectId("511907e3fb13145a3d2e225c"), "name" : [ "George", "Raymond", "Richard" ] }
{ "_id" : ObjectId("511907e3fb13145a3d2e225d"), "name" : [ "George", "Raymond", "Richard", "Martin" ] }
>
Полагайте, что изменение сторонних библиотек сделало, чтобы они использовали видевший их Случайные экземпляры. Хотя у Вас нет исходного кода, можно, вероятно, отредактировать байт-код, чтобы сделать это. Один полезный инструментарий для того, чтобы сделать такой является ASM.
Ваша опция 2 будет на самом деле работать со следующими направлениями.
Вам будет нужно (как anjab сказал) изменить путь к классу начальной загрузки.
В командной строке программы необходимо добавить следующее:
java-Xbootclasspath/p:C:\your\random_impl.jar YourProgram
Принятие Вы находитесь на машине Windown или пути в этом отношении в любой ОС.
Та опция добавляет классы в файлах банки, прежде чем rt.jar будут загружены. Таким образом, Ваше Случайное будет загружено, прежде чем rt.jar Случайный класс делает.
Использование отображено путем ввода:
java -X
Это отображает все X (tra) функций de, JVM имеет. Это май не доступный на других реализациях VM, таких как JRockit или другой, но это находится там на Sun JVM.
- Xbootclasspath/p: предварительно ожидайте перед путем к классу начальной загрузки
У меня есть использование этот подход в приложении, где класс ШАРА по умолчанию должен быть заменен реализацией ШАРА других. Класс ШАРА является частью Ядра Java и никогда не имел проблемы.
Удачи.
"Используйте пользовательский classloader для загрузки нашего собственного Случайного класса вместо версии JVM. Этот подход не будет работать, потому что Java не позволяет classloaders переопределять классы в пакете Java".
как насчет того, чтобы изменить bootclasspath для использования пользовательского Случайного класса?
BR, ~A
Хотя Вы не можете изменить classloader тривиально для "java.x" и "sun.x" пакетов, существует способ счесть загрузку класса (и устанавливать "после того, как класс был bytecoded и загрузил" слушателя) классов тезисов, таким образом, Вы могли установить что-то как семя после загрузки классов от этих пакетов. Подсказка: Используйте отражение.
Так или иначе пока у меня нет дальнейшей информации, чего точно Вы хотите достигнуть, довольно трудно помочь Вам здесь.
P.S.: знайте, что "статичный {}" - блоки могут препятствовать Вам бездельничающий с семенами, снова.
Вы могли использовать AOP, чтобы прервать вызовы к Случайному и вертеть аргумент к тому, что Вы хотите.
Sam
Да, вариант 2 работает:
создал два класса для целей тестирования с именами ThirdPartyClass.java
и Random.java
создал jar из ThirdPartyClass.class
jar -cvf tpc.jar ThirdPartyClass.class
создал jar из Random.class
jar -cvf rt123.jar Random.class
после этого выполните следующую команду:
java -Xbootclasspath/p:tcp.jar:rt123.jar -cp . -verbose ThirdPartyClass
Результатом будет: начальное значение для ThirdPartyClass-> 1
исходный код ThirdPartyClass.java ----->
import java.util.Random;
public class ThirdPartyClass {
ThirdPartyClass(long seed ) {
System.out.println("seed value for ThirdPartyClass-> "+seed);
}
public static void main(String [] args) {
ThirdPartyClass tpc=new ThirdPartyClass(new Random().nextLong());
}
}
исходный код Random.java --- ---->
package java.util;
import java.io.Serializable;
public class Random extends Object implements Serializable
{
public Random() {
}
public Random(long seed) {
}
public long nextLong() {
return 1;
}
}
Спасибо Махавир Прасад Мали