Mongodb Mongoose查询匹配数组的文档,无论其元素顺序如何 使用MangGDB/MangOOSE,考虑我的测试< /代码>集合,有以下2个文件: "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property” : "PROP1", "value" : "GREEN" }, { "property” : "PROP2", "value" : "RED" } ]
及 我使用以下命令查找寄存器:Mongodb Mongoose查询匹配数组的文档,无论其元素顺序如何 使用MangGDB/MangOOSE,考虑我的测试< /代码>集合,有以下2个文件: "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property” : "PROP1", "value" : "GREEN" }, { "property” : "PROP2", "value" : "RED" } ],mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,及 我使用以下命令查找寄存器: db.tests.find( { properties: [ { "property" : "PROP2", "value" : "RED" }, { "property" : "PROP1", "value" : "GREEN" }
db.tests.find(
{ properties: [
{
"property" : "PROP2",
"value" : "RED"
},
{
"property" : "PROP1",
"value" : "GREEN"
}
]
}).pretty();
返回REGISTER2
,而不是REGISTER1
同样地:
db.tests.find(
{ properties: [
{
"property" : "PROP1",
"value" : "GREEN"
},
{
"property" : "PROP2",
"value" : "RED"
}
]
}).pretty();
返回REGISTER1
,而不是REGISTER2
我需要两个查询都返回元素“REGISTER1”和“REGISTER2”,因为这两个元素之间唯一的变化是属性顺序(数组顺序)
无论查询元素的数组顺序如何,如何查询以同时返回
REGISTER1
和REGISTER2
第一个文档上的属性名称是property\u id
,第二个文档是property
请将$elemMatch
与$or
一起使用以获取两个匹配的文档
db.tests.find({
properties : {$elemMatch : {$or : [
{"property" : "PROP1", "value" : "GREEN"},
{"property" : "PROP2", "value" : "RED"}
]}}
})
样本采集
> db.tests.find()
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property" : "PROP1", "value" : "GREEN" }, { "property" : "PROP2", "value" : "RED" } ] }
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc1"), "name" : "REGISTER2", "properties" : [ { "property" : "PROP2", "value" : "RED" }, { "property" : "PROP1", "value" : "GREEN" } ] }
发现
您可以对此使用查询:
db.tests.find({
properties: {$all: [
{property: 'PROP1', value: 'GREEN'},
{property: 'PROP2', value: 'RED'}
]}})
$all
的两个元素都必须存在,文档才能匹配,但顺序无关
对于properties
元素除了匹配的键之外还包含更多键的情况,可以使用:
$elemMatch
确保每个属性
/值
元组匹配相同的元素。在第一个文档上,键是属性id
,在第二个文档上,键是属性
,它似乎返回具有PROP1或PROP2 ser的寄存器,但事实并非如此。我需要以任意顺序设置它们…我已经用输出更新了答案,你能发布预期的输出吗?第二段代码正是我要寻找的答案。。。谢谢
> db.tests.find({properties : {$elemMatch : {$or : [{"property" : "PROP1", "value" : "GREEN"},{"property" : "PROP2", "value" : "RED"}]}}})
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property" : "PROP1", "value" : "GREEN" }, { "property" : "PROP2", "value" : "RED" } ] }
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc1"), "name" : "REGISTER2", "properties" : [ { "property" : "PROP2", "value" : "RED" }, { "property" : "PROP1", "value" : "GREEN" } ] }
>
db.tests.find({
properties: {$all: [
{property: 'PROP1', value: 'GREEN'},
{property: 'PROP2', value: 'RED'}
]}})
db.tests.find({
properties: {$all: [
{$elemMatch: {property: 'PROP1', value: 'GREEN'}},
{$elemMatch: {property: 'PROP2', value: 'RED'}}
]}})