MongoDB:带有ObjectId数组的$ in

关于我刚才经历的一些问题,我还在思考为什么:

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

0

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

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();

非常感谢你提前。

问候,

  • 路易斯卡帕

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

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

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

        Strict Mode         mongo Shell Mode
        -----------         ----------------
    
       { "$oid": "<id>" }  ObjectId( "<id>" )
    

    因此,要从shell / console模式查询包含objectid的字段,您需要使用ObjectId("<id>") 。 mongo shell模式下的语法是什么。

    因此查询:

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

    会返回你的行数。

    现在通过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.
    }
    
    链接地址: http://www.djcxy.com/p/81195.html

    上一篇: MongoDB: $in with an ObjectId array

    下一篇: Multiple keyspace support for spring