只是一个关于我刚刚经历过的事情的快速问题,我仍在思考为什么:
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();
非常感谢你。
此致
答案 0 :(得分:5)
根据文档
,这两种格式都是MongoDB中对象id的有效表示http://docs.mongodb.org/manual/reference/mongodb-extended-json/
它们在两种模式中表现不同,
Strict Mode mongo Shell Mode
----------- ----------------
{ "$oid": "<id>" } ObjectId( "<id>" )
因此,要从shell /控制台模式查询包含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.
}
答案 1 :(得分:0)
我遇到了同样的问题。 我这样解决了。
db.collection('post').find({ 'postIds': { $elemMatch: { $in:
deletedPosts.map(_post => {ObjectId(_post._id)}) } } })