Query MongoDB Using 'ObjectId'

前端 未结 5 881
情歌与酒
情歌与酒 2020-12-09 02:15

I have inserted documents into MongoDB without an id. And I want to retrieve them by searching through their MongoDB ObjectId, that has been assign

相关标签:
5条回答
  • 2020-12-09 02:38

    You need to create an instance of ObjectId and then query using that instance, otherwise your query compares ObjectIds to string and fails to find matching documents.

    This should work:

    var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
    var entity = dbCollection.FindOne(query_id);
    return entity.ToString();
    
    0 讨论(0)
  • 2020-12-09 02:39

    In C# for latest official MongoDB.Driver write this-

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

    We can accomplish the same result without converting id from string to ObjectId. But then, we will have to add [BsonRepresentation(BsonType.ObjectId)] before id attribute in the model class.

    The code can even be further simplified using lambda expression-

    var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault();
    return entity.ToString();
    
    0 讨论(0)
  • 2020-12-09 02:43

    If you're here in 2018 and want copy/paste code that still works or pure string syntax;

        [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);
        }
    
    0 讨论(0)
  • 2020-12-09 02:47

    The selected answer is correct. For anyone confused by the Query.EQ, here is another way to write a basic update (updates the entire mongodb document):

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

    The ObjectId object is needed when you want to actually search by object ID, otherwise it is comparing string to objectid type, and it won't match. Mongo is very type-strict in this way, regardless if the field name is correct.

    0 讨论(0)
  • 2020-12-09 02:55

    You can also do it this way, its

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

    then in your method you can do something like this

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

    Note: id param in GetInternalId its a parameter on that method. In case you need as this:

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

    Hope it helps also.

    0 讨论(0)
提交回复
热议问题