MongoDB:$in,带有ObjectId数组

MongoDB:$in,带有ObjectId数组,mongodb,mongodb-query,mongodb-java,morphia,Mongodb,Mongodb Query,Mongodb Java,Morphia,只是一个关于我刚刚经历的事情的简短问题,我还在想为什么: mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ { "$oid" : "53f1f09f2cdcc8f339e5efa2"} , { "$oid" : "5409ae2e2cdc31c5aa0ce0a5"}]}}); 0 二, 我认为$oid和ObjectId的拼写格式对于MongoDB完全相同。有人知道为什么第一个查询返回0个结果,而第二个查询返回2个结果(正

只是一个关于我刚刚经历的事情的简短问题,我还在想为什么:

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

二,

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

此外,我正在使用Morphia框架,它使用MongoDB Java驱动程序与MongoDB交互。通过执行以下代码行,我意识到在ObjectID数组中使用$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();
ListfParams=newarraylist();
fParams.添加(…);
Query Query=genericDAO.createQuery();
(fParams)中的query.field(“idReferenceList”);
result=genericDAO.find(query.asList();
事先非常感谢

问候,

  • 路易斯·卡帕

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

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

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

   { "$oid": "<id>" }  ObjectId( "<id>" )
将返回您的行计数

现在通过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.
}
String[]id={“53f1f09f2cdcc8f339e5efa2”,“5409ae2e2cdc31c5aa0ce0a5”};
ObjectId[]objarray=新ObjectId[id.length];
对于(inti=0;i我面临同样的问题。
我决定这样做

db.collection('post').find({ 'postIds': { $elemMatch: { $in:
deletedPosts.map(_post => {ObjectId(_post._id)}) } } })

问题是我不是在查询“_id”字段,而是查询“idReferenceList”,这是用objectid数组的字段类型定义的另一个不同字段。如您所见,它不起作用…objectid表示形式保持不变,无论它出现在哪个字段中。将更新我的答案。我只是引用了_id字段。但使用“$oid”representación它不起作用。你测试过吗?只需通过shell保存两个测试文档,然后自己尝试一下。问题是我使用的是MongoDB Java驱动程序,我自己无法直接拼写“ObjectId”查询格式。是的,请仔细阅读我的答案。$oid表示法在shell中不起作用,因为它是严格模式下要遵循的语法。所以…有什么办法解决这个问题吗?因为正如我告诉过你的,我使用的是MongoDB Java驱动程序,查询拼写没有预期的灵活。genericDAO.find(query).asList();//您可以这样做并进行检查吗。?Wjat是您在此中使用的筛选器。顺便说一句,createQuery(筛选器)。抱歉,这只是一个打字错误。此“createQuery”方法是一个内部方法,通过fParams列表进行筛选来创建查询。简而言之,genericDAO.Find(this.createQuery(筛选器))与genericDAO.Find(Query)相同.对不起。
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.
}
db.collection('post').find({ 'postIds': { $elemMatch: { $in:
deletedPosts.map(_post => {ObjectId(_post._id)}) } } })