{
"_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构建查询。
答案 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表达式或一个返回布尔值的函数。有了这个,并且由于您使用的是数组,因此可以在这些数组上使用函数some和every。
我们假设我们有一个 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>