web-dev-qa-db-ja.com

MongoDB:ObjectId配列を使用した$ in

私が今経験したことについての簡単な質問であり、私はまだ理由について考えています:

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

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

2

$ oidとObjectIdの両方のスペル形式は、MongoDBでもまったく同じだと思いました。最初のクエリで0の結果が返され、2番目のクエリで2(正解)が返される理由を誰かが知っていますか?

さらに、MongoDB Javaドライバーを使用してMongoDBと対話するMorphiaフレームワークを使用しています。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();

事前にどうもありがとうございました。

よろしく、

  • ルイス・カッパ
12
lcappa

ドキュメントによると、これらの形式は両方ともMongoDBのオブジェクトIDの有効な表現です。

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

そして、それらは2つのモードで異なって表現されました。

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

   { "$oid": "<id>" }  ObjectId( "<id>" )
_

したがって、オブジェクトIDを含むフィールドをクエリするには、シェル/コンソールモードからObjectId("<id>")を使用する必要があります。これは、mongoシェルモードで従うべき構文です。

したがって、クエリ:

_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.
}
_
5
BatScream

私は同じ問題に直面しました。私はこのように解決しました。

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