如何找到包含特定单词的分组百分比

时间:2019-05-04 21:45:16

标签: mongodb aggregation-framework

我正在尝试计算MongoDB中包含按集合对象分组的特定单词的列表的百分比。

我设法对包含单词的列表计数进行了分组,但没有对每个组列表总数中的百分比进行分组。

我的收藏集如下:

=> printenv
arch=arm
args_mmc=run finduuid;setenv bootargs console=${console} ${cape_disable} ${cape_enable} ${cape_uboot} root=PARTUUID=${uuid} ro rootfstype=${mmcrootfstype} ${uboot_detected_capes} ${cmdline}
args_mmc_old=setenv bootargs console=${console} ${optargs} ${cape_disable} ${cape_enable} ${cape_uboot} root=${oldroot} ro rootfstype=${mmcrootfstype} ${uboot_detected_capes} ${cmdline}
args_mmc_uuid=setenv bootargs console=${console} ${optargs} ${cape_disable} ${cape_enable} ${cape_uboot} root=UUID=${uuid} ro rootfstype=${mmcrootfstype} ${uboot_detected_capes} ${cmdline}
args_netinstall=setenv bootargs ${netinstall_bootargs} ${optargs} ${cape_disable} ${cape_enable} ${cape_uboot} root=/dev/ram rw ${uboot_detected_capes} ${cmdline}
args_uenv_root=setenv bootargs console=${console} ${optargs} ${cape_disable} ${cape_enable} ${cape_uboot} root=${uenv_root} ro rootfstype=${mmcrootfstype} ${uboot_detected_capes} ${cmdline}
autoconf=off
baudrate=115200
board=am335x
board_eeprom_header=undefined
board_name=A335PBGL
board_rev=00A2
board_serial=1748EPB00050
boot=${devtype} dev ${mmcdev}; if ${devtype} rescan; then gpio set 54;setenv bootpart ${mmcdev}:1; if test -e ${devtype} ${bootpart} /etc/fstab; then setenv mmcpart 1;fi; echo Checking for: /uEnv.txt
 ...;if test -e ${devtype} ${bootpart} /uEnv.txt; then if run loadbootenv; then gpio set 55;echo Loaded environment from /uEnv.txt;run importbootenv;fi;echo Checking if uenvcmd is set ...;if test -n 
${uenvcmd}; then gpio set 56; echo Running uenvcmd ...;run uenvcmd;fi;echo Checking if client_ip is set ...;if test -n ${client_ip}; then if test -n ${dtb}; then setenv fdtfile ${dtb};echo using ${fd
tfile} ...;fi;gpio set 56; if test -n ${uname_r}; then echo Running nfsboot_uname_r ...;run nfsboot_uname_r;fi;echo Running nfsboot ...;run nfsboot;fi;fi; echo Checking for: /${script} ...;if test -e
 ${devtype} ${bootpart} /${script}; then gpio set 55;setenv scriptfile ${script};run loadbootscript;echo Loaded script from ${scriptfile};gpio set 56; run bootscript;fi; echo Checking for: /boot/${sc
ript} ...;if test -e ${devtype} ${bootpart} /boot/${script}; then gpio set 55;setenv scriptfile /boot/${script};run loadbootscript;echo Loaded script from ${scriptfile};gpio set 56; run bootscript;fi
; echo Checking for: /boot/uEnv.txt ...;for i in 1 2 3 4 5 6 7 ; do setenv mmcpart ${i};setenv bootpart ${mmcdev}:${mmcpart};if test -e ${devtype} ${bootpart} /boot/uEnv.txt; then gpio set 55;load ${
devtype} ${bootpart} ${loadaddr} /boot/uEnv.txt;env import -t ${loadaddr} ${filesize};echo Loaded environment from /boot/uEnv.txt;if test -n ${dtb}; then echo debug: [dtb=${dtb}] ... ;setenv fdtfile 
${dtb};echo Using: dtb=${fdtfile} ...;fi;echo Checking if uname_r is set in /boot/uEnv.txt...;if test -n ${uname_r}; then gpio set 56; setenv oldroot /dev/mmcblk${mmcdev}p${mmcpart};echo Running unam
e_boot ...;run uname_boot;fi;fi;done;fi;
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binary=if fdt addr ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr ${fdtcontroladdr};fi;load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootarm.
efi; if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_fdt=try
boot_fit=0
boot_net_usb_start=usb start
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_syslinux_conf=extlinux/extlinux.conf
boot_targets=mmc0 legacy_mmc0 mmc1 legacy_mmc1 pxe dhcp 
bootcmd=if test ${boot_fit} -eq 1; then run update_to_fit; fi; run findfdt; run init_console; run envboot; run distro_bootcmd
bootcmd_dhcp=run boot_net_usb_start; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fd
tfile ${soc}-${board}${boardver}.dtb; fi; setenv efi_old_vci ${bootp_vci};setenv efi_old_arch ${bootp_arch};setenv bootp_vci PXEClient:Arch:00010:UNDI:003000;setenv bootp_arch 0xa;if dhcp ${kernel_ad
dr_r}; then tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi;fi;setenv bootp_vci ${
efi_old_vci};setenv bootp_arch ${efi_old_arch};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_vci;
bootcmd_legacy_mmc0=gpio clear 56; gpio clear 55; gpio clear 54; gpio set 53; setenv devtype mmc; setenv mmcdev 0; setenv bootpart 0:1 ; run boot
bootcmd_legacy_mmc1=gpio clear 56; gpio clear 55; gpio clear 54; gpio set 53; setenv devtype mmc; setenv mmcdev 1; setenv bootpart 1:1 ; run boot
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_pxe=run boot_net_usb_start; dhcp; if pxe get; then pxe boot; fi
bootcount=1
bootdelay=2
bootdir=/boot
bootenv=uEnv.txt
bootenvfile=uEnv.txt
bootfile=vmlinuz-4.19.31-ti-r18
bootm_size=0x10000000
bootpart=0:0
bootscript=echo Running bootscript from mmc${bootpart} ...; source ${loadaddr}
capeloadoverlay=if test -e ${devtype} ${bootpart} ${uboot_overlay}; then run loadoverlay;setenv cape_uboot bone_capemgr.uboot_capemgr_enabled=1; else echo uboot_overlays: unable to find [${devtype} $
{bootpart} ${uboot_overlay}]...;fi;
console=ttyO0,115200n8
cpu=armv7
device=eth0
dfu_alt_info_emmc=rawemmc raw 0 3751936;boot part 1 1;rootfs part 1 2;MLO fat 1 1;MLO.raw raw 0x100 0x100;u-boot.img.raw raw 0x300 0x1000;u-env.raw raw 0x1300 0x200;spl-os-args.raw raw 0x1500 0x200;s
pl-os-image.raw raw 0x1700 0x6900;spl-os-args fat 1 1;spl-os-image fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1
dfu_alt_info_mmc=boot part 0 1;rootfs part 0 2;MLO fat 0 1;MLO.raw raw 0x100 0x100;u-boot.img.raw raw 0x300 0x1000;u-env.raw raw 0x1300 0x200;spl-os-args.raw raw 0x1500 0x200;spl-os-image.raw raw 0x1
700 0x6900;spl-os-args fat 0 1;spl-os-image fat 0 1;u-boot.img fat 0 1;uEnv.txt fat 0 1
dfu_alt_info_ram=kernel ram 0x80200000 0x4000000;fdt ram 0x80f80000 0x80000;ramdisk ram 0x81000000 0x4000000
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
eeprom_bbb_header=i2c dev 0; i2c mw 0x50 0x00.2 aa; i2c mw 0x50 0x01.2 55; i2c mw 0x50 0x02.2 33; i2c mw 0x50 0x03.2 ee; i2c mw 0x50 0x04.2 41; i2c mw 0x50 0x05.2 33; i2c mw 0x50 0x06.2 33; i2c mw 0x
50 0x07.2 35; i2c mw 0x50 0x08.2 42; i2c mw 0x50 0x09.2 4e; i2c mw 0x50 0x0a.2 4c; i2c mw 0x50 0x0b.2 54; 
eeprom_bbbl_footer= i2c mw 0x50 0x0c.2 42; i2c mw 0x50 0x0d.2 4c; i2c mw 0x50 0x0e.2 41; i2c mw 0x50 0x0f.2 32; 
eeprom_bbbw_footer= i2c mw 0x50 0x0c.2 42; i2c mw 0x50 0x0d.2 57; i2c mw 0x50 0x0e.2 41; i2c mw 0x50 0x0f.2 35; 
eeprom_beaglelogic= i2c mw 0x50 0x00.2 aa; i2c mw 0x50 0x01.2 55; i2c mw 0x50 0x02.2 33; i2c mw 0x50 0x03.2 ee; i2c mw 0x50 0x04.2 41; i2c mw 0x50 0x05.2 33; i2c mw 0x50 0x06.2 33; i2c mw 0x50 0x07.2
 35; i2c mw 0x50 0x08.2 42; i2c mw 0x50 0x09.2 4c; i2c mw 0x50 0x0a.2 47; i2c mw 0x50 0x0b.2 43; i2c mw 0x50 0x0c.2 30; i2c mw 0x50 0x0d.2 30; i2c mw 0x50 0x0e.2 30; i2c mw 0x50 0x0f.2 41; 
eeprom_blank=i2c dev 0; i2c mw 0x50 0x00.2 ff; i2c mw 0x50 0x01.2 ff; i2c mw 0x50 0x02.2 ff; i2c mw 0x50 0x03.2 ff; i2c mw 0x50 0x04.2 ff; i2c mw 0x50 0x05.2 ff; i2c mw 0x50 0x06.2 ff; i2c mw 0x50 0x
07.2 ff; i2c mw 0x50 0x08.2 ff; i2c mw 0x50 0x09.2 ff; i2c mw 0x50 0x0a.2 ff; i2c mw 0x50 0x0b.2 ff; i2c mw 0x50 0x0c.2 ff; i2c mw 0x50 0x0d.2 ff; i2c mw 0x50 0x0e.2 ff; i2c mw 0x50 0x0f.2 ff; i2c mw
 0x50 0x10.2 ff; i2c mw 0x50 0x11.2 ff; i2c mw 0x50 0x12.2 ff; i2c mw 0x50 0x13.2 ff; i2c mw 0x50 0x14.2 ff; i2c mw 0x50 0x15.2 ff; i2c mw 0x50 0x16.2 ff; i2c mw 0x50 0x17.2 ff; i2c mw 0x50 0x18.2 ff
; i2c mw 0x50 0x19.2 ff; i2c mw 0x50 0x1a.2 ff; i2c mw 0x50 0x1b.2 ff; i2c mw 0x50 0x1c.2 ff; i2c mw 0x50 0x1d.2 ff; i2c mw 0x50 0x1e.2 ff; i2c mw 0x50 0x1f.2 ff; 
eeprom_dump=i2c dev 0; i2c md 0x50 0x00.2 20; 
eeprom_pocketbeagle= i2c mw 0x50 0x00.2 aa; i2c mw 0x50 0x01.2 55; i2c mw 0x50 0x02.2 33; i2c mw 0x50 0x03.2 ee; i2c mw 0x50 0x04.2 41; i2c mw 0x50 0x05.2 33; i2c mw 0x50 0x06.2 33; i2c mw 0x50 0x07.
2 35; i2c mw 0x50 0x08.2 50; i2c mw 0x50 0x09.2 42; i2c mw 0x50 0x0a.2 47; i2c mw 0x50 0x0b.2 4c; i2c mw 0x50 0x0c.2 30; i2c mw 0x50 0x0d.2 30; i2c mw 0x50 0x0e.2 41; i2c mw 0x50 0x0f.2 32; 
eeprom_program=if test $board_eeprom_header = bbb_blank; then run eeprom_dump; run eeprom_blank; run eeprom_bbb_header; run eeprom_dump; reset; fi; if test $board_eeprom_header = bbbl_blank; then run
 eeprom_dump; run eeprom_blank; run eeprom_bbb_header; run eeprom_bbbl_footer; run eeprom_dump; reset; fi; if test $board_eeprom_header = bbbw_blank; then run eeprom_dump; run eeprom_blank; run eepro
m_bbb_header; run eeprom_bbbw_footer; run eeprom_dump; reset; fi; if test $board_eeprom_header = pocketbeagle_blank; then run eeprom_dump; run eeprom_blank; run eeprom_pocketbeagle; run eeprom_dump; 
reset; fi; if test $board_eeprom_header = beaglelogic_blank; then run eeprom_dump; run eeprom_blank; run eeprom_beaglelogic; run eeprom_dump; reset; fi;  
efi_dtb_prefixes=/ /dtb/ /dtb/current/
envboot=mmc dev ${mmcdev}; if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadbootscript; then run bootscript;else if run loadbootenv; then echo Loaded env from ${bootenvfile};run i
mportbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;fi;fi;
eth1addr=98:5d:ad:34:62:66
ethact=usb_ether
ethaddr=98:5d:ad:34:62:64
failumsboot=echo; echo FAILSAFE: U-Boot UMS (USB Mass Storage) enabled, media now available over the usb slave port ...; ums 0 ${devtype} 1;
fdt_addr_r=0x88000000
fdtaddr=0x88000000
fdtfile=undefined
findfdt=echo board_name=[$board_name] ...; if test $board_name = A335BLGC; then setenv fdtfile am335x-beaglelogic.dtb; fi; if test $board_name = A335BONE; then setenv fdtfile am335x-bone.dtb; fi; if 
test $board_name = A335BNLT; then echo board_rev=[$board_rev] ...; if test $board_rev = GH01; then setenv fdtfile am335x-boneblack.dtb; elif test $board_rev = BBG1; then setenv fdtfile am335x-bonegre
en.dtb; elif test $board_rev = BP00; then setenv fdtfile am335x-pocketbone.dtb; elif test $board_rev = GW1A; then setenv fdtfile am335x-bonegreen-wireless.dtb; elif test $board_rev = AIA0; then seten
v fdtfile am335x-abbbi.dtb; elif test $board_rev = EIA0; then setenv fdtfile am335x-boneblack.dtb; elif test $board_rev = ME06; then setenv fdtfile am335x-bonegreen.dtb; elif test $board_rev = M10A; 
then setenv fdtfile am335x-vsc8531bbb.dtb; elif test $board_rev = OS00; then setenv fdtfile am335x-osd3358-sm-red.dtb; else setenv fdtfile am335x-boneblack.dtb; fi; fi; if test $board_name = A335PBGL
; then setenv fdtfile am335x-pocketbeagle.dtb; fi; if test $board_name = BBBW; then setenv fdtfile am335x-boneblack-wireless.dtb; fi; if test $board_name = BBG1; then setenv fdtfile am335x-bonegreen.
dtb; fi; if test $board_name = BBGW; then setenv fdtfile am335x-bonegreen-wireless.dtb; fi; if test $board_name = BBBL; then setenv fdtfile am335x-boneblue.dtb; fi; if test $board_name = BBEN; then s
etenv fdtfile am335x-sancloud-bbe.dtb; fi; if test $board_name = OS00; then setenv fdtfile am335x-osd3358-sm-red.dtb; fi; if test $board_name = A33515BB; then setenv fdtfile am335x-evm.dtb; fi; if te
st $board_name = A335X_SK; then setenv fdtfile am335x-evmsk.dtb; fi; if test $board_name = A335_ICE; then setenv fdtfile am335x-icev2.dtb; fi; if test $fdtfile = undefined; then setenv board_name A33
5BNLT; setenv board_rev EMMC; setenv fdtfile am335x-bonegreen.dtb; fi; 
finduuid=part uuid ${devtype} ${bootpart} uuid
fit_bootfile=fitImage
fit_loadaddr=0x90000000
gw_ip=192.168.1.1
if_netconsole=ping $serverip
importbootenv=echo Importing environment from ${devtype} ...; env import -t ${loadaddr} ${filesize}
init_console=if test $board_name = A335_ICE; then setenv console ttyO3,115200n8;elif test $board_name = A335BLGC; then setenv console ttyO4,115200n8;else setenv console ttyO0,115200n8;fi;
ipaddr=192.168.1.2
kernel_addr_r=0x82000000
load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
loadaddr=0x82000000
loadbootenv=load ${devtype} ${bootpart} ${loadaddr} ${bootenvfile}
loadbootscript=load ${devtype} ${bootpart} ${loadaddr} ${scriptfile};
loadfdt=echo loading ${fdtdir}/${fdtfile} ...; load ${devtype} ${bootpart} ${fdtaddr} ${fdtdir}/${fdtfile}
loadfit=run args_mmc; bootm ${loadaddr}#${fdtfile};
loadimage=load ${devtype} ${bootpart} ${loadaddr} ${bootdir}/${bootfile}
loadoverlay=echo uboot_overlays: loading ${uboot_overlay} ...; load ${devtype} ${bootpart} ${rdaddr} ${uboot_overlay}; fdt addr ${fdtaddr}; fdt resize ${fdt_buffer}; fdt apply ${rdaddr}; fdt resize $
{fdt_buffer};
loadramdisk=load mmc ${mmcdev} ${rdaddr} ramdisk.gz
loadrd=load ${devtype} ${bootpart} ${rdaddr} ${bootdir}/${rdfile}; setenv rdsize ${filesize}
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi
mmcboot=mmc dev ${mmcdev}; setenv devnum ${mmcdev}; setenv devtype mmc; if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadimage; then if test ${boot_fit} -eq 1; then run loadfit; e
lse run mmcloados;fi;fi;fi;
mmcdev=0
mmcloados=run args_mmc; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then if test -n ${uname_r}; then bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}; else bootz ${loada
ddr} - ${fdtaddr}; fi; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
mmcrootfstype=ext4 rootwait
netargs=setenv bootargs console=${console} ${optargs} root=/dev/nfs nfsroot=${serverip}:${rootpath},${nfsopts} rw ip=dhcp
netboot=echo Booting from network ...; setenv autoload no; dhcp; run netloadimage; run netloadfdt; run netargs; bootz ${loadaddr} - ${fdtaddr}
netloadfdt=tftp ${fdtaddr} ${fdtfile}
netloadimage=tftp ${loadaddr} ${bootfile}
netmask=255.255.255.0
nfs_options=,vers=3
nfsargs=setenv bootargs console=${console} ${optargs} ${cape_disable} ${cape_enable} ${cape_uboot} root=/dev/nfs rw rootfstype=${nfsrootfstype} nfsroot=${nfsroot} ip=${ip} ${cmdline}
nfsboot=echo Booting from ${server_ip} ...; setenv nfsroot ${server_ip}:${root_dir}${nfs_options}; setenv ip ${client_ip}:${server_ip}:${gw_ip}:${netmask}:${hostname}:${device}:${autoconf}; setenv au
toload no; setenv serverip ${server_ip}; setenv ipaddr ${client_ip}; tftp ${loadaddr} ${tftp_dir}${bootfile}; tftp ${fdtaddr} ${tftp_dir}dtbs/${fdtfile}; run nfsargs; bootz ${loadaddr} - ${fdtaddr}
nfsboot_uname_r=echo Booting from ${server_ip} ...; setenv nfsroot ${server_ip}:${root_dir}${nfs_options}; setenv ip ${client_ip}:${server_ip}:${gw_ip}:${netmask}:${hostname}:${device}:${autoconf}; s
etenv autoload no; setenv serverip ${server_ip}; setenv ipaddr ${client_ip}; tftp ${loadaddr} ${tftp_dir}vmlinuz-${uname_r}; tftp ${fdtaddr} ${tftp_dir}dtbs/${uname_r}/${fdtfile}; run nfsargs; bootz 
${loadaddr} - ${fdtaddr}
nfsopts=nolock
nfsrootfstype=ext4 rootwait fixrtc
partitions=uuid_disk=${uuid_gpt_disk};name=bootloader,start=384K,size=1792K,uuid=${uuid_gpt_bootloader};name=rootfs,start=2688K,size=-,uuid=${uuid_gpt_rootfs}
pb_eeprom_hdr=mw 82001000 ee3355aa; mw 82001004 35333341; mw 82001008 4c474250
preboot=run if_netconsole start_netconsole
pxefile_addr_r=0x80100000
ramargs=setenv bootargs console=${console} ${optargs} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootz ${loadaddr} ${rdaddr} ${fdtaddr}
ramdisk_addr_r=0x88080000
ramroot=/dev/ram0 rw
ramrootfstype=ext2
rdaddr=0x88080000
root_dir=/home/userid/targetNFS
rootpath=/export/rootfs
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_boot
part} bootfstype; then run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efi_dtb_prefixes}; do if test -e ${
devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootarm.efi; then echo Found EFI removable me
dia binary efi/boot/bootarm.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo SCRIPT FAILED: continu
ing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo
 SCRIPT FAILED: continuing...; fi; done
script=boot.scr
scriptaddr=0x80000000
scriptfile=${script}
serial#=1748EPB00050
server_ip=192.168.1.100
serverip=192.168.1.1
soc=am33xx
spiargs=setenv bootargs console=${console} ${optargs} root=${spiroot} rootfstype=${spirootfstype}
spiboot=echo Booting from spi ...; run spiargs; sf probe ${spibusno}:0; sf read ${loadaddr} ${spisrcaddr} ${spiimgsize}; bootz ${loadaddr}
spibusno=0
spiimgsize=0x362000
spiroot=/dev/mtdblock4 rw
spirootfstype=jffs2
spisrcaddr=0xe0000
start_netconsole=setenv ncip $serverip; setenv bootdelay 10; setenv stdin serial,nc; setenv stdout serial,nc; setenv stderr serial,nc; version
static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off
stderr=ns16550_serial
stdin=ns16550_serial
stdout=ns16550_serial
uname_boot=setenv bootdir /boot; setenv bootfile vmlinuz-${uname_r}; if test -e ${devtype} ${bootpart} ${bootdir}/${bootfile}; then echo loading ${bootdir}/${bootfile} ...; run loadimage;setenv fdtdi
r /boot/dtbs/${uname_r}; echo debug: [enable_uboot_overlays=${enable_uboot_overlays}] ... ;if test -n ${enable_uboot_overlays}; then echo debug: [enable_uboot_cape_universal=${enable_uboot_cape_unive
rsal}] ... ;if test -n ${enable_uboot_cape_universal}; then echo debug: [uboot_base_dtb_univ=${uboot_base_dtb_univ}] ... ;if test -n ${uboot_base_dtb_univ}; then echo uboot_overlays: [uboot_base_dtb=
${uboot_base_dtb_univ}] ... ;if test -e ${devtype} ${bootpart} ${fdtdir}/${uboot_base_dtb_univ}; then setenv fdtfile ${uboot_base_dtb_univ};echo uboot_overlays: Switching too: dtb=${fdtfile} ...;if t
est -n ${uboot_try_cape_universal}; then env delete -f uboot_try_cape_universal; fi;setenv cape_uboot bone_capemgr.uboot_capemgr_enabled=1; else echo debug: unable to find [${uboot_base_dtb_univ}] us
ing [${uboot_base_dtb}] instead ... ;echo debug: [uboot_base_dtb_univ=${uboot_base_dtb}] ... ;if test -n ${uboot_base_dtb}; then echo uboot_overlays: [uboot_base_dtb=${uboot_base_dtb}] ... ;if test -
e ${devtype} ${bootpart} ${fdtdir}/${uboot_base_dtb}; then setenv fdtfile ${uboot_base_dtb};echo uboot_overlays: Switching too: dtb=${fdtfile} ...;fi;fi;fi;fi;else echo debug: [uboot_base_dtb_univ=${
uboot_base_dtb}] ... ;if test -n ${uboot_base_dtb}; then echo uboot_overlays: [uboot_base_dtb=${uboot_base_dtb}] ... ;if test -e ${devtype} ${bootpart} ${fdtdir}/${uboot_base_dtb}; then setenv fdtfil
e ${uboot_base_dtb};echo uboot_overlays: Switching too: dtb=${fdtfile} ...;fi;fi;fi;fi;if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then run loadfdt;else setenv fdtdir /usr/lib/linux-image
-${uname_r}; if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then run loadfdt;else setenv fdtdir /lib/firmware/${uname_r}/device-tree; if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; 
then run loadfdt;else setenv fdtdir /boot/dtb-${uname_r}; if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then run loadfdt;else setenv fdtdir /boot/dtbs; if test -e ${devtype} ${bootpart} ${f
dtdir}/${fdtfile}; then run loadfdt;else setenv fdtdir /boot/dtb; if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then run loadfdt;else setenv fdtdir /boot; if test -e ${devtype} ${bootpart} 
${fdtdir}/${fdtfile}; then run loadfdt;else if test -e ${devtype} ${bootpart} ${fdtfile}; then run loadfdt;else echo; echo unable to find [dtb=${fdtfile}] did you name it correctly? ...; run failumsb
oot;fi;fi;fi;fi;fi;fi;fi;fi; if test -n ${enable_uboot_overlays}; then setenv fdt_buffer 0x60000;if test -n ${uboot_fdt_buffer}; then setenv fdt_buffer ${uboot_fdt_buffer};fi;echo uboot_overlays: [fd
t_buffer=${fdt_buffer}] ... ;if test -n ${uboot_silicon}; then setenv uboot_overlay ${uboot_silicon}; run virtualloadoverlay;fi;if test -n ${uboot_model}; then setenv uboot_overlay ${uboot_model}; ru
n virtualloadoverlay;fi;if test -n ${uboot_overlay_addr0}; then if test -n ${disable_uboot_overlay_addr0}; then echo uboot_overlays: uboot loading of [${uboot_overlay_addr0}] disabled by /boot/uEnv.t
xt [disable_uboot_overlay_addr0=1]...;else setenv uboot_overlay ${uboot_overlay_addr0}; run capeloadoverlay;fi;fi;if test -n ${uboot_overlay_addr1}; then if test -n ${disable_uboot_overlay_addr1}; th
en echo uboot_overlays: uboot loading of [${uboot_overlay_addr1}] disabled by /boot/uEnv.txt [disable_uboot_overlay_addr1=1]...;else setenv uboot_overlay ${uboot_overlay_addr1}; run capeloadoverlay;f
i;fi;if test -n ${uboot_overlay_addr2}; then if test -n ${disable_uboot_overlay_addr2}; then echo uboot_overlays: uboot loading of [${uboot_overlay_addr2}] disabled by /boot/uEnv.txt [disable_uboot_o
verlay_addr2=1]...;else setenv uboot_overlay ${uboot_overlay_addr2}; run capeloadoverlay;fi;fi;if test -n ${uboot_overlay_addr3}; then if test -n ${disable_uboot_overlay_addr3}; then echo uboot_overl
ays: uboot loading of [${uboot_overlay_addr3}] disabled by /boot/uEnv.txt [disable_uboot_overlay_addr3=1]...;else setenv uboot_overlay ${uboot_overlay_addr3}; run capeloadoverlay;fi;fi;if test -n ${u
boot_overlay_addr4}; then setenv uboot_overlay ${uboot_overlay_addr4}; run capeloadoverlay;fi;if test -n ${uboot_overlay_addr5}; then setenv uboot_overlay ${uboot_overlay_addr5}; run capeloadoverlay;
fi;if test -n ${uboot_overlay_addr6}; then setenv uboot_overlay ${uboot_overlay_addr6}; run capeloadoverlay;fi;if test -n ${uboot_overlay_addr7}; then setenv uboot_overlay ${uboot_overlay_addr7}; run
 capeloadoverlay;fi;if test -n ${uboot_emmc}; then if test -n ${disable_uboot_overlay_emmc}; then echo uboot_overlays: uboot loading of [${uboot_emmc}] disabled by /boot/uEnv.txt [disable_uboot_overl
ay_emmc=1]...;else setenv uboot_overlay ${uboot_emmc}; run virtualloadoverlay;fi;fi;if test -n ${uboot_video}; then if test -n ${disable_uboot_overlay_video}; then echo uboot_overlays: uboot loading 
of [${uboot_video}] disabled by /boot/uEnv.txt [disable_uboot_overlay_video=1]...;else if test -n ${disable_uboot_overlay_audio}; then echo uboot_overlays: uboot loading of [${uboot_video}] disabled 
by /boot/uEnv.txt [disable_uboot_overlay_audio=1]...;setenv uboot_overlay ${uboot_video_naudio}; run virtualloadoverlay;else setenv uboot_overlay ${uboot_video}; run virtualloadoverlay;fi;fi;fi;if te
st -n ${uboot_wireless}; then if test -n ${disable_uboot_overlay_wireless}; then echo uboot_overlays: uboot loading of [${uboot_wireless}] disabled by /boot/uEnv.txt [disable_uboot_overlay_wireless=1
]...;else setenv uboot_overlay ${uboot_wireless}; run virtualloadoverlay;fi;fi;if test -n ${uboot_adc}; then if test -n ${disable_uboot_overlay_adc}; then echo uboot_overlays: uboot loading of [${ubo
ot_adc}] disabled by /boot/uEnv.txt [disable_uboot_overlay_adc=1]...;else setenv uboot_overlay ${uboot_adc}; run virtualloadoverlay;fi;fi;if test -n ${uboot_overlay_pru}; then setenv uboot_overlay ${
uboot_overlay_pru}; run virtualloadoverlay;fi;if test -n ${dtb_overlay}; then setenv uboot_overlay ${dtb_overlay}; echo uboot_overlays: [dtb_overlay=${uboot_overlay}] ... ;run capeloadoverlay;fi;if t
est -n ${uboot_detected_capes}; then echo uboot_overlays: [uboot_detected_capes=${uboot_detected_capes_addr0}${uboot_detected_capes_addr1}${uboot_detected_capes_addr2}${uboot_detected_capes_addr3}] .
.. ;setenv uboot_detected_capes uboot_detected_capes=${uboot_detected_capes_addr0}${uboot_detected_capes_addr1}${uboot_detected_capes_addr2}${uboot_detected_capes_addr3}; fi;if test -n ${uboot_try_ca
pe_universal}; then if test -n ${enable_uboot_cape_universal}; then if test -n ${cape_uboot}; then echo uboot_overlays: cape universal disabled, external cape enabled or detected...;else if test -n $
{uboot_cape_universal_bbb}; then if test -n ${disable_uboot_overlay_emmc}; then if test -n ${disable_uboot_overlay_video}; then setenv uboot_overlay /lib/firmware/univ-bbb-xxx-00A0.dtbo; else if test
 -n ${disable_uboot_overlay_audio}; then setenv uboot_overlay /lib/firmware/univ-bbb-xVx-00A0.dtbo; else setenv uboot_overlay /lib/firmware/univ-bbb-xVA-00A0.dtbo; fi;fi;else if test -n ${disable_ubo
ot_overlay_video}; then setenv uboot_overlay /lib/firmware/univ-bbb-Exx-00A0.dtbo; else if test -n ${disable_uboot_overlay_audio}; then setenv uboot_overlay /lib/firmware/univ-bbb-EVx-00A0.dtbo; else
 setenv uboot_overlay /lib/firmware/univ-bbb-EVA-00A0.dtbo; fi;fi;fi;run capeloadoverlay;fi;if test -n ${uboot_cape_universal_bbg}; then if test -n ${disable_uboot_overlay_emmc}; then setenv uboot_ov
erlay /lib/firmware/univ-bbb-xxx-00A0.dtbo; else setenv uboot_overlay /lib/firmware/univ-bbb-Exx-00A0.dtbo; fi;run capeloadoverlay;fi;if test -n ${uboot_cape_universal_bbgw}; then if test -n ${disabl
e_uboot_overlay_emmc}; then if test -n ${disable_uboot_overlay_wireless}; then setenv uboot_overlay /lib/firmware/univ-bbgw-xx-00A0.dtbo; else setenv uboot_overlay /lib/firmware/univ-bbgw-xW-00A0.dtb
o; fi;else if test -n ${disable_uboot_overlay_wireless}; then setenv uboot_overlay /lib/firmware/univ-bbgw-Ex-00A0.dtbo; else setenv uboot_overlay /lib/firmware/univ-bbgw-EW-00A0.dtbo; fi;fi;run cape
loadoverlay;fi;fi;else echo uboot_overlays: add [enable_uboot_cape_universal=1] to /boot/uEnv.txt to enable...;fi;fi;else echo uboot_overlays: add [enable_uboot_overlays=1] to /boot/uEnv.txt to enabl
e...;fi;setenv rdfile initrd.img-${uname_r}; if test -e ${devtype} ${bootpart} ${bootdir}/${rdfile}; then echo loading ${bootdir}/${rdfile} ...; run loadrd;if test -n ${netinstall_enable}; then run a
rgs_netinstall; run message;echo debug: [${bootargs}] ... ;echo debug: [bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}] ... ;bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}; fi;if test -n ${uenv_r
oot}; then run args_uenv_root;echo debug: [${bootargs}] ... ;echo debug: [bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}] ... ;bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}; fi;if test -n ${uuid
}; then run args_mmc_uuid;echo debug: [${bootargs}] ... ;echo debug: [bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}] ... ;bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}; fi;run args_mmc_old;echo
 debug: [${bootargs}] ... ;echo debug: [bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}] ... ;bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr}; else if test -n ${uenv_root}; then run args_uenv_root;
echo debug: [${bootargs}] ... ;echo debug: [bootz ${loadaddr} - ${fdtaddr}] ... ;bootz ${loadaddr} - ${fdtaddr}; fi;run args_mmc_old;echo debug: [${bootargs}] ... ;echo debug: [bootz ${loadaddr} - ${
fdtaddr}] ... ;bootz ${loadaddr} - ${fdtaddr}; fi;fi;
update_to_fit=setenv loadaddr ${fit_loadaddr}; setenv bootfile ${fit_bootfile}
usb_boot=usb start; if usb dev ${devnum}; then devtype=usb; run scan_dev_for_boot_part; fi
usbnet_devaddr=98:5d:ad:34:62:64
vendor=ti
ver=U-Boot 2019.04-dirty (May 04 2019 - 00:07:17 -0700)
virtualloadoverlay=if test -e ${devtype} ${bootpart} ${uboot_overlay}; then run loadoverlay;else echo uboot_overlays: unable to find [${devtype} ${bootpart} ${uboot_overlay}]...;fi;

Environment size: 27858/131068 bytes

我想预测在meta.model中每个包含“ Negotiable”一词的meta.brand品牌广告所占的百分比。

我已经用过类似的计数:

{
        "_id" : "103456",
        "metadata" : {
                "type" : "Bike",
                "brand" : "Siamoto",
                "model" : "Siamoto  vespa '01 - € 550 EUR (Negotiable)"
        }
},
{
        "_id" : "103457",
        "metadata" : {
                "type" : "Bike",
                "brand" : "BMW",
                "model" : "BMW ADFR '06 - € 5680 EUR"
        }
}

,它起作用了,但我找不到该百分比的解决方法。感谢所有人

1 个答案:

答案 0 :(得分:0)

对于您尝试做的事情,使用$text搜索甚至是$regex是错误的方法。这些所有可以做的就是从集合中返回“匹配”文档。

使用汇总计数字符串匹配项

Whist不如正则表达式灵活(遗憾的是,目前没有等效的聚合运算符,但是将来的版本中会存在。请参见SERVER-11947),更好的选择是使用$indexOfCP为了匹配“字符串”的出现,然后将它们与每个分组的“总计数”进行计数:

db.advertisements.aggregate([
  { "$group": {
    "_id": "$metadata.brand",
    "totalCount": { "$sum": 1 },
    "matchedCount": {
      "$sum": {
        "$cond": [{ "$ne": [{ "$indexOfCP": [ "$metadata.model", "Negotiable" ] }, -1 ] }, 1, 0]
      }
    }
  }},
  { "$addFields": {
    "percentage": {
      "$cond": {
        "if": { "$ne": [ "$matchedCount", 0 ] },
        "then": {
          "$multiply": [
            { "$divide": [ "$matchedCount", "$totalCount" ] },
            100
          ]
        },
        "else": 0
      }
    }
  }},
  { "$sort": { "percentage": -1 } }
])

结果:

{ "_id" : "Siamoto", "totalCount" : 1, "matchedCount" : 1, "percentage" : 100 }
{ "_id" : "BMW", "totalCount" : 1, "matchedCount" : 0, "percentage" : 0 }

请注意,$group用于累积在"brand"中找到的所有文档以及与字符串匹配的文档。此处使用的$cond运算符是“三元”或if/then/else语句,该语句对布尔表达式求值,然后在true处返回一个值,或者在false处返回另一个值。在这种情况下,$indexOfCP不返回-1值或“未找到”。

“百分比”实际上是在单独的阶段完成的,在这种情况下,我们使用$addFields添加“其他字段”。该操作基本上是上一个阶段的两个累加值的$divide。仅仅使用$cond来避免“被0除”错误,而$multiply只是将小数位移动到更像“百分比”的位置。但是基本前提是这样的计算,要求首先累积“总计”,这将始终是“后期”的一种操作。

MongoDB 4.2(建议)预览

FYI,基于MongoDB 4.2中$regexFind的当前“未定型”语法(已提议,如果包含在该发行版中则尚未定稿),其后将是这样的:

db.advertisements.aggregate([
  { "$group": {
    "_id": "$metadata.brand",
    "totalCount": { "$sum": 1 },
    "matchedCount": {
      "$sum": {
        "$cond": {
          "if": {
            "$ne": [
              { "$regexFind": {
                "input": "$metadata.model",
                "regex": /Negotiable/i
              }},
              null
            ]
          },
          "then": 1,
          "else": 0
        }
      }
    }
  }},
  { "$addFields": {
    "percentage": {
      "$cond": {
        "if": { "$ne": [ "$matchedCount", 0 ] },
        "then": {
          "$multiply": [
            { "$divide": [ "$matchedCount", "$totalCount" ] },
            100
          ]
        },
        "else": 0
      }
    }
  }},
  { "$sort": { "percentage": -1 } }
])

再次强烈指出,“当前”实现在发布时可能会发生变化。这就是当前4.1.9-17-g0a856820ba开发版本中的工作方式。

使用MapReduce

另一种方法是您的MongoDB版本不支持$indexOfCP,或者您在“字符串匹配”方面需要更大的灵活性,而不是使用mapReduce进行聚合:

db.advertisements.mapReduce(
  function() {
    emit(this.metadata.brand, {
      totalCount: 1,
      matchedCount: (/Negotiable/i.test(this.metadata.model)) ? 1 : 0
    });
  },
  function(key,values) {
    var obj = { totalCount: 0, matchedCount: 0 };
    values.forEach(value => {
      obj.totalCount += value.totalCount;
      obj.matchedCount += value.matchedCount;
    });
    return obj;
  },
  {
    "out": { "inline": 1 },
    "finalize": function(key,value) {
      value.percentage = (value.matchedCount != 0)
        ? (value.matchedCount / value.totalCount) * 100
        : 0;
      return value;
    }
  }
)

这与 相似,但是以一种非常“ mapReduce”的特定方式:

            {
                    "_id" : "BMW",
                    "value" : {
                            "totalCount" : 1,
                            "matchedCount" : 0,
                            "percentage" : 0
                    }
            },
            {
                    "_id" : "Siamoto",
                    "value" : {
                            "totalCount" : 1,
                            "matchedCount" : 1,
                            "percentage" : 100
                    }
            }

逻辑基本相同。我们使用"brand"的“键”来“发出”,然后使用另一个三元来确定是否计算“匹配”。在这种情况下,使用正则表达式test()进行操作,甚至以“不区分大小写”匹配为例。

“归约器”部分仅累加发出的值,而finalize函数是通过相同的除法和乘法过程返回“百分比”的地方。

除了基本功能之外,这两者之间的主要区别在于,mapReduce不能完成finalize中的积累和基本操作之外的“其他事情”。如果没有输出到单独的集合并对包含的那些文档进行单独的mapReducefind(),则无法用sort()完成聚合管道中演示的“排序”。


这两种方法都有效,这仅取决于您的需求和可用功能。当然,与使用aggregate()的{​​{1}}评估相比,任何JavaScript方法都将更快 。因此,在可能的情况下,您可能希望将mapReduce作为自己的偏好。