Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 Mongoose查询匹配数组的文档,无论其元素顺序如何 使用MangGDB/MangOOSE,考虑我的测试< /代码>集合,有以下2个文件: "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property” : "PROP1", "value" : "GREEN" }, { "property” : "PROP2", "value" : "RED" } ]_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

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'}} 
]}})