Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 字段顺序未知时嵌入文档上的精确匹配_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb 字段顺序未知时嵌入文档上的精确匹配

Mongodb 字段顺序未知时嵌入文档上的精确匹配,mongodb,mongodb-query,Mongodb,Mongodb Query,报告说: 要在整个嵌入文档上指定相等匹配,请使用 查询文档{:}其中是 要匹配的文档。嵌入文档上的相等匹配需要 与指定的完全匹配,包括字段顺序 使用点表示法并不是一个完全令人满意的解决方案,因为它还可以匹配包含比所需字段更多字段的文档。我可能不知道哪些是其他可能的字段,因此无法明确排除不需要的字段 查询每个可能的字段组合也是不可取的,因为我不想写(#字段)!查询 那么,当我不关心字段的顺序时,如何找到包含嵌入文档的文档 例如,假设一组文档遵循此模式,但内部字段的顺序未知或可能有所不同,具体取决

报告说:

要在整个嵌入文档上指定相等匹配,请使用 查询文档
{:}
其中
是 要匹配的文档。嵌入文档上的相等匹配需要 与指定的
完全匹配,包括字段顺序

使用点表示法并不是一个完全令人满意的解决方案,因为它还可以匹配包含比所需字段更多字段的文档。我可能不知道哪些是其他可能的字段,因此无法明确排除不需要的字段

查询每个可能的字段组合也是不可取的,因为我不想写(#字段)!查询

那么,当我不关心字段的顺序时,如何找到包含嵌入文档的文档


例如,假设一组文档遵循此模式,但
内部
字段的顺序未知或可能有所不同,具体取决于插入方式/时间:

{
_id: ObjectId()
inner: {
    some_field: some_value,
    some_other_field: some_other_value
    }
}
如果我想将包含
内部
对象的所有文档作为
{some_field:some_value,some_other_field:some_other_value}
,我想

db.collection.find({inner:{some_field: some_value, some_other_field: some_other_value}})
但是我将错过带有
内部
对象
{some_other_字段:some_other_值,some_字段:some_值}
的文档

使用点表示法,如

db.collection.find({"inner.some_field": some_value, "inner.some_other_field": some_other_value})
将匹配所有我感兴趣的文件,但也包括噪音等

{
_id: ObjectId()
inner: {
    some_field: some_value,
    some_other_field: some_other_value,
    some_undesired_field: some_undesired_value
    }
}

尝试传递要查找的文档。这对我很有用,但字段的顺序也很重要

find({“inner”:{“some_field”:some_value,“some_other_field”:some_other_value}).pretty()

我刚读到字段顺序未知。因此,您必须使用$或列出以下可能性:


find({$or:[{“内部”:{“some_field”:some_value,“some_other_field”:some_other_value}},{“内部”:{“some_other_field”:some_other_value,“some_field”:some_value})

解决此问题的一种方法是,您希望在结果中包含这两个字段(以任何顺序),而不包含其他字段

点表示法解决了问题的第一部分,您可以通过确保
internal
只有2个字段来解决第二部分

db.collection.find({
  "inner.some_field": some_value,
  "inner.some_other_field": some_other_value,
  $where: function() { return Object.keys(this.inner).length === 2 }  
})

我相信这是最简单的方法。这种方法的缺点是,
$where
可能会很慢,原因如下:

我就是这么想的。但是假设我的对象包含N个字段,我必须写N!
运算符的表达式?这听起来像是对N>2的过度杀戮。我希望会有一个更实用的解决方案。也就是说,对于两个以上的领域来说,它不是很实用。我将测试其他操作符,如$in,以了解它们在尝试匹配整个文档时的行为。