Если вы не хотите использовать aggregate
, другое решение должно использовать find
, а затем сортировать результаты на стороне клиента с помощью array#sort
:
Если значения $in
являются примитивными типами, такими как числа, вы можете использовать такой подход, как:
var ids = [4, 2, 8, 1, 9, 3, 5, 6];
MyModel.find({ _id: { $in: ids } }).exec(function(err, docs) {
docs.sort(function(a, b) {
// Sort docs by the order of their _id values in ids.
return ids.indexOf(a._id) - ids.indexOf(b._id);
});
});
Если значения $in
являются непримитивными типами, например ObjectId
s, требуется другой подход поскольку indexOf
сравнивается по ссылке в этом случае.
Если вы используете Node.js 4.x +, вы можете использовать Array#findIndex
и ObjectID#equals
, чтобы отрегулировать это, изменив функцию sort
на:
docs.sort((a, b) => ids.findIndex(id => a._id.equals(id)) -
ids.findIndex(id => b._id.equals(id)));
Или с любой версией Node.js, с подчеркиванием / lodash's findIndex
:
docs.sort(function (a, b) {
return _.findIndex(ids, function (id) { return a._id.equals(id); }) -
_.findIndex(ids, function (id) { return b._id.equals(id); });
});
Invoke-команда имеет параметр -throttle, который может помочь. Это ограничивает количество потоков, поэтому может помочь ограничить пропускную способность.
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue |
ForEach-Item -Process {
Start-Sleep -Seconds 1
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
filter Delay-Object ([int]$Milliseconds) {
Start-Sleep -Milliseconds $Milliseconds
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
[111]
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
Get-ChildItem \\my\share\*.* | ForEach-Object {
# do your search here
}
Вы можете просто ввести задержку прямо в вашу итерацию:
Get-ChildItem \\my\share\*.* | ForEach-Object {
Start-Sleep -Seconds 1
# do your search here
}
Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
Get-ChildItem \\my\share\*.* | Select-String findme
Тогда решение остается тем же: вставьте ForEach-Object
!
Get-ChildItem \\my\share\*.* |
ForEach-Object {
Start-Sleep -Seconds 1
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
[111]
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
[112] Вы можете просто ввести задержку прямо в вашу итерацию:
[113] Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
[114] Тогда решение остается тем же: вставьте ForEach-Object
!
[115] Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
# have to return the original object back to the pipeline
} |
Select-String findme
Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
}
Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue |
Delay-Object -Milliseconds 1000 |
Select-String -Pattern "xxxx" |
select filename, Linenumber, Line, Path |
Format-Table
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
Get-ChildItem \\my\share\*.* | ForEach-Object {
# do your search here
}
Вы можете просто ввести задержку прямо в вашу итерацию:
Get-ChildItem \\my\share\*.* | ForEach-Object {
Start-Sleep -Seconds 1
# do your search here
}
Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
Get-ChildItem \\my\share\*.* | Select-String findme
Тогда решение остается тем же: вставьте ForEach-Object
!
Get-ChildItem \\my\share\*.* |
ForEach-Object {
Start-Sleep -Seconds 1
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
[111]
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
[112] Вы можете просто ввести задержку прямо в вашу итерацию:
[113] Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
[114] Тогда решение остается тем же: вставьте ForEach-Object
!
[115] Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
# have to return the original object back to the pipeline
} |
Select-String findme
Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
} |
Select-String -Pattern "xxxx" |
select filename, Linenumber, Line, Path |
Format-Table
Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
filter Delay-Object ([int]$Milliseconds) {
Start-Sleep -Milliseconds $Milliseconds
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
[111]
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
Get-ChildItem \\my\share\*.* | ForEach-Object {
# do your search here
}
Вы можете просто ввести задержку прямо в вашу итерацию:
Get-ChildItem \\my\share\*.* | ForEach-Object {
Start-Sleep -Seconds 1
# do your search here
}
Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
Get-ChildItem \\my\share\*.* | Select-String findme
Тогда решение остается тем же: вставьте ForEach-Object
!
Get-ChildItem \\my\share\*.* |
ForEach-Object {
Start-Sleep -Seconds 1
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
[111]
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
[112] Вы можете просто ввести задержку прямо в вашу итерацию:
[113] Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
[114] Тогда решение остается тем же: вставьте ForEach-Object
!
[115] Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
# have to return the original object back to the pipeline
} |
Select-String findme
Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
}
Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue |
Delay-Object -Milliseconds 1000 |
Select-String -Pattern "xxxx" |
select filename, Linenumber, Line, Path |
Format-Table
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
Get-ChildItem \\my\share\*.* | ForEach-Object {
# do your search here
}
Вы можете просто ввести задержку прямо в вашу итерацию:
Get-ChildItem \\my\share\*.* | ForEach-Object {
Start-Sleep -Seconds 1
# do your search here
}
Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
Get-ChildItem \\my\share\*.* | Select-String findme
Тогда решение остается тем же: вставьте ForEach-Object
!
Get-ChildItem \\my\share\*.* |
ForEach-Object {
Start-Sleep -Seconds 1
С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):
[110] Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter
, который является кратким способом написания функции с поддержкой конвейера :
[111]
Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:
[112] Вы можете просто ввести задержку прямо в вашу итерацию:
[113] Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String
:
[114] Тогда решение остается тем же: вставьте ForEach-Object
!
[115] Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>
# have to return the original object back to the pipeline
} |
Select-String findme
Вы можете подумать, что Get-ChildItem
собирается найти все файлы сначала и передайте их все вместе, и это даже будет слишком большой нагрузкой на сетевые диски, но конвейер не работает таким образом. * sup>
Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.
* некоторым конвейерным командам, таким как Sort-Object
, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки. sup>