以下是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)));
其中Date
是util.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。我的查询结构有什么问题吗?
答案 0 :(得分:0)
我的猜测是,这个问题现在没有实际意义,但是,如果你仍然不认为它得到了回答,你是否正在寻找“$ not”运算符,它可以检查不存在的类型。