MongoDB:带有ObjectId数组的$ in

lca*_*ppa 12 mongodb morphia mongodb-java mongodb-query

关于我刚刚经历过的事情的一个快速问题,我仍在思考为什么:

mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ { "$oid" : "53f1f09f2cdcc8f339e5efa2"} , { "$oid" : "5409ae2e2cdc31c5aa0ce0a5"}]}});
Run Code Online (Sandbox Code Playgroud)

0

mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}});
Run Code Online (Sandbox Code Playgroud)

2

我认为$ oid和ObjectId拼写格式对于MongoDB完全相同.有谁知道为什么第一个查询返回0结果,第二个返回2(正确的答案)?

此外,我正在使用Morphia框架,它使用MongoDB Java驱动程序与MongoDB交互.我已经意识到通过执行以下代码行在ObjectIds数组中使用$ in运算符搜索非_id的字段存在问题:

List< ObjectId > fParams = new ArrayList< ObjectId >();

fParams.add(...);

Query<Ticket> query = genericDAO.createQuery();

query.field("idReferenceList").in(fParams);

result = genericDAO.find(query).asList();
Run Code Online (Sandbox Code Playgroud)

非常感谢你提前.

问候,

  • 路易斯卡帕

Bat*_*eam 5

根据文档,这两种格式都是MongoDB中对象id的有效表示,

http://docs.mongodb.org/manual/reference/mongodb-extended-json/

它们在两种模式中表现不同,

    Strict Mode         mongo Shell Mode
    -----------         ----------------

   { "$oid": "<id>" }  ObjectId( "<id>" )
Run Code Online (Sandbox Code Playgroud)

因此,要从shell /控制台模式查询包含objectid的字段,您需要使用ObjectId("<id>").这是mongo shell模式中要遵循的语法.

因此查询:

db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}});
Run Code Online (Sandbox Code Playgroud)

将返回行数.

现在通过Java API来做,

你需要这样做:

String[] ids = {"53f1f09f2cdcc8f339e5efa2","5409ae2e2cdc31c5aa0ce0a5"};
ObjectId[] objarray = new ObjectId[ids.length];

for(int i=0;i<ids.length;i++)
{
    objarray[i] = new ObjectId(ids[i]);
}

BasicDBObject inQuery = new BasicDBObject("$in", objarray);
BasicDBObject query = new BasicDBObject("idReferenceList", inQuery);
DBCursor cursor = db.collection.find(query);
while(cursor.hasNext())
{
    DBObject doc = cursor.next();
    // process the doc.
}
Run Code Online (Sandbox Code Playgroud)