gpt4 book ai didi

MongoDB:带有 ObjectId 数组的 $in

转载 作者:IT老高 更新时间:2023-10-28 13:14:11 24 4
gpt4 key购买 nike

就我刚刚经历的事情提出一个简短的问题,我仍在思考为什么:

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.
}

关于MongoDB:带有 ObjectId 数组的 $in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25768213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com