0
這裏查詢是我的MongoDB的樣本文件:的MongoDB與Java API
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()
我試圖獲取用戶數誰購買產品的一個'on date「2015-02-01」但在同一天沒有購買產品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
是 「2015年2月1日」 在util.Date
對象。
我發現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。我的查詢結構有什麼問題嗎?
你應該可以在'BasicDBObject'上使用'toString()'來查看它生成的查詢。當然,它忽略了第一部分,因爲這是一個'Map',並且你使用'transaction'鍵兩次。雖然第二個壓倒了第一個。 –
'toString()'輸出也與遊標對象相同。 'Query:{「transaction」:{「$ elemMatch」:{「prod」:{「$ nin」:[「b」,「c」]},「purchasedAt」:{「$ date」:「2015-02 -01T00:00:00.000Z「}}}}' – harshad
請參閱我的評論的第二部分:'BasicDBObject'是一個'Map'。 –