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,以了解它们在尝试匹配整个文档时的行为。