如何获取文件比较同一文档(嵌套字段)mongodb的两个felids

时间:2018-01-30 07:49:54

标签: java mongodb

{ 
"_id" : ObjectId("5a3218bbdcb7c38fd3731232"),   
"json" : {
    "query_by_gtin_response:queryByGtinResponse" : {
        "xmlns" : "urn:gs1:tsd:query_by_gtin_response:xsd:1", 
        "productData" : {
            "productDataRecord" : [
                {
                    "module" : [
                        {
                            "product_tracking_information_module" : {                                    
                                "createdDate" : "2017-12-13T13:30:08.297Z",                                    
                                "updatedDate" : "2017-12-13T13:30:08.297Z",                                      
                            }
                        }, 
                    ]
                }
            ]
        }
    }
}, 

如果createdDate = updatedDate,我上面的文件。我认为因为嵌套它不起作用。你能建议如何获取这个文件。我正在使用java构建查询。

2 个答案:

答案 0 :(得分:0)

$ where 过滤器上,使用 this obj 关键字访问当前文档属性并比较这些值:

this.json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.module.product_tracking_information_module.createDate == this.json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.module.product_tracking_information_module.updateDate

修改

$ where 过滤器需要一个javascript表达式或一个返回布尔值的函数。有了这个,并且由于您使用的是数组,因此可以在这些数组上使用函数someevery

我们假设我们有一个 T 这样的集合:

a: {b : [{c: Date, d: Date}]}

如果我们想要至少包含一个匹配元素的文档,我们会像这样使用 some

db.T.find({$where: "this.a.b.some((el) => el.c.valueOf() == el.d.valueOf())"})

如果数组的所有元素必须与条件匹配,我们使用每个

db.T.find({$where: "this.a.b.every((el) => el.c.valueOf() == el.d.valueOf())"})

现在,您的集合有一个嵌套数组。有了这些,就有4个可能性:

1:选择至少有一个createdDate == updatedDate的所有文档,无论它是什么“productDateRecord”元素。

db.T.find({$where: "this.json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.some((outside) => outside.module.some((inside) inside.createdDate.valueOf() == inside.updatedDate.valueOf()))"})

2:选择所有“productDateRecord”对象至少有一个createdUpdate == updatedDate的所有文档,无论它是什么“模块”。

db.T.find({$where: "this.json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.every((outside) => outside.module.some((inside) => inside.createdDate.valueOf() == inside.updatedDate.valueOf()))"})

3:选择至少有一个“productDateRecord”的所有文档,其中所有“module”元素都已创建更新== updatedDate

db.T.find({$where: "this.json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.some((outside) => outside.module.every((inside) => inside.createdDate.valueOf() == inside.updatedDate.valueOf()))"})

4:选择所有文档,其中每个“productDateRecord”都包含所有“module”元素,其中createdUpdate == updatedDate

db.T.find({$where: "this.json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.every((outside) => outside.module.every((inside) => inside.createdDate.valueOf() == inside.updatedDate.valueOf()))"})

答案 1 :(得分:0)

    MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
    DB database = mongoClient.getDB("test");
    DBObject query = new BasicDBObject("json.query_by_gtin_response:queryByGtinResponse.productData.productDataRecord.module.product_tracking_information_module.updatedDate", "2017-12-13T13:30:08.297Z");
    DBCollection collection = database.getCollection("testData");
    DBCursor cursor = collection.find(query);
    DBObject jo = cursor.one();
    System.out.println((String)cursor.one().get("_id"));

给我输出:5a3218bbdcb7c38fd3731232

请注意,在db控制台上,我运行了以下命令:

use test

t = { "_id" : "5a3218bbdcb7c38fd3731232", "json" : { "query_by_gtin_response:queryByGtinResponse" : { "xmlns" : "urn:gs1:tsd:query_by_gtin_response:xsd:1", "productData" : { "productDataRecord" : [ { "module" : [ { "product_tracking_information_module" : { "createdDate" : "2017-12-13T13:30:08.297Z", "updatedDate" : "2017-12-13T13:30:08.297Z" } } ] } ] } } } }

db.testData.insert( t );

我正在使用maven项目,并在pom.xml中输入以下内容:

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.6.1</version></dependency>