MongoDB使用Java API查询

时间:2015-04-07 19:15:04

标签: java mongodb api mongodb-query

以下是MongoDB的示例文档:

user:{
_id:1,
name:'xyz',
age:12,
mobile:21321312,
transaction:[{
trans_id:1,
prod:'a',
purchasedAt:ISODate("2015-02-01"),
},
{
trans_id:2,
prod:'b',
purchasedAt:ISODate("2015-02-01")
},
{
trans_id:3,
prod:'c',
purchasedAt:ISODate("2014-11-24")
}]
,...
}

我的查询如下:

db.user.find({transaction:{$elemMatch:{prod:'a', purchasedAt:ISODate("2015-02-01")}}, transaction:{$elemMatch:{prod:{$nin:['b','c']}, purchasedAt:ISODate("2015-02-01")}}}).count()

我正在尝试让那些在“2015-02-01”上购买产品“a”的用户计数但是没有购买产品b& c在同一天。

因此,在尝试使用查询在Java中执行此操作时:

coll.find(new BasicDBObject().append("transaction", new BasicDBObject("$elemMatch", new BasicDBObject("prod", 'a').append("purchasedAt", Date))).append("transaction", new BasicDBObject("$elemMatch", new BasicDBObject("prod", new BasicDBObject("$nin",['b','c'])).append("purchasedAt", Date)));

我也尝试过:

coll.find(new BasicDBObject("transaction", new BasicDBObject("$elemMatch", new BasicDBObject("prod", 'a').append("purchasedAt", Date))).append("transaction", new BasicDBObject("$elemMatch", new BasicDBObject("prod", new BasicDBObject("$nin",['b','c'])).append("purchasedAt", Date)));

其中Dateutil.Date对象中的“2015-02-01”。

我发现Java忽略了查询的$in部分,即它忽略了{transaction:{$elemMatch:{prod:'a', purchasedAt:ISODate("2015-02-01")}}&仅执行$nin部分。

  

我是通过DBCursor对象发现的。

这是光标的输出:

Cursor: Cursor id=0, ns=mydb.user, query={ "transaction" : { "$elemMatch" : { "prod" : { "$nin" : [ "b" , "c"]} , "purchasedAt" : { "$date" : "2015-02-01T00:00:00.000Z"}}}}, numIterated=0, readPreference=primary

因此我的结果不准确。我想知道为什么完全相同的查询在Mongo shell中运行良好但不适用于Java API。我的查询结构有什么问题吗?

1 个答案:

答案 0 :(得分:0)

我的猜测是,这个问题现在没有实际意义,但是,如果你仍然不认为它得到了回答,你是否正在寻找“$ not”运算符,它可以检查不存在的类型。