基于javaapi的MongoDB查询
以下是我的MongoDB的示例文档:基于javaapi的MongoDB查询,java,mongodb,api,mongodb-query,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(
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忽略了查询部分中的$,也就是说,它忽略了{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。我的查询结构有什么问题吗?< /P> < P>我猜这个问题现在已经不成立了,但是,如果你仍然不考虑它的答案,你是在寻找“$$”吗?运算符,它可以检查不存在的类型。
您应该能够使用toString()
在基本CDBO对象上查看它生成的查询。当然,它会忽略第一部分,因为这是一个映射
,您可以使用事务
键两次。尽管第二个键会覆盖第一个。toString()
输出也与游标对象相同。查询:{“transaction”:{“$elemMatch”:{“prod”:{“$nin”:[“b”,“c”]},“purchasedAt”:{“$date”:“2015-02-01T00:00:00.000Z”}}
请参阅我评论的第二部分:basicdboObject
是一个映射
。谢谢,这很有用。但是我如何让Java同时查询这两个部分呢?还有其他方法可以查询吗?我无法理解我的查询结构。你可以简单地使用$和操作符()在里面你放了两个事务
查询。这应该行得通。