web-dev-qa-db-ja.com

「ObjectId」を使用したMongoDBのクエリ

documentなしでidsをMongoDBに挿入しました。そして、割り当てられた MongoDB ObjectId を検索して、それらを取得しますデフォルト

これが私の試みです

var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153");
var entity = dbCollection.FindOne(query_id);
return entity.ToString();

そして、私は次のエラーを受け取ります-

タイプ 'System.NullReferenceException'のファーストチャンス例外が発生しました

何が問題ですか?

27
Mike Barnes

ObjectIdのインスタンスを作成し、そのインスタンスを使用してクエリを実行する必要があります。そうしないと、クエリはObjectIdsを文字列と比較し、一致するドキュメントが見つかりません。

これは動作するはずです:

var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.FindOne(query_id);
return entity.ToString();
52
soulcheck

C#最新の公式MongoDB.Driverでこれを書く

_var filter_id = Builders<MODEL_NAME>.Filter.Eq("id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.Find(filter).FirstOrDefault();
return entity.ToString();
_

idを文字列からObjectIdに変換しなくても同じ結果を得ることができます。ただし、モデルクラスのid属性の前に[BsonRepresentation(BsonType.ObjectId)]を追加する必要があります。

lambda expression-を使用して、コードをさらに簡素化することもできます。

_var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault();
return entity.ToString();
_
24
Minhas Kamal

あなたが2018年にここにいて、まだ機能するコピー/貼り付けコードまたは純粋な文字列構文が必要な場合;

    [Fact]
    public async Task QueryUsingObjectId()
    {
        var filter = Builders<CosmosParkingFactory>.Filter.Eq("_id", new ObjectId("5b57516fd16cb04bfc35fcc6"));
        var entity = stocksCollection.Find(filter);
        var stock = await entity.SingleOrDefaultAsync();
        Assert.NotNull(stock);

        var idString = "5b57516fd16cb04bfc35fcc6";
        var stringFilter = "{ _id: ObjectId('" + idString + "') }";
        var entityStringFiltered = stocksCollection.Find(stringFilter);
        var stockStringFiltered = await entityStringFiltered.SingleOrDefaultAsync();
        Assert.NotNull(stockStringFiltered);
    }
2
Kdog

選択した答えは正しいです。 Query.EQに混乱している人のために、基本的な更新(mongodbドキュメント全体を更新)を記述する別の方法を次に示します。

string mongoDocumentID = "123455666767778";
var query = new QueryDocument("_id", ObjectId.Parse(mongoDocumentID)); 
var update = new UpdateDocument { { "$set", documentToSave } };
mongoCollection.Update(query, update, UpdateFlags.Multi);

ObjectIdオブジェクトは、オブジェクトIDで実際に検索する場合に必要です。そうでない場合は、文字列をobjectidタイプと比較しており、一致しません。 Mongoは、フィールド名が正しいかどうかに関係なく、このように非常に型が厳密です。

2
smakus

この方法でもできます

public static ObjectId GetInternalId(string id)
    {
        if (!ObjectId.TryParse(id, out ObjectId internalId))
            internalId = ObjectId.Empty;

        return internalId;
    }

あなたの方法では、このようなことをすることができます

ObjectId internalId = GetMongoId.GetInternalId(id);
        return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync();

注:GetInternalIdのid paramは、そのメソッドのパラメーターです。これが必要な場合:

public async Task<YourTable> Find(string id)
    {
        ObjectId internalId = GetMongoId.GetInternalId(id);
        return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync();
    }

それが役に立てば幸いです。

0
Raul Baez